gpt4 book ai didi

Java:从 super 构造函数捕获异常

转载 作者:行者123 更新时间:2023-12-01 06:44:51 25 4
gpt4 key购买 nike

我尝试编写自己的加载器类来加载加密的类。

因此,我还重写了构造 loader(ClassLoader paramClassLoader, File paramFile),它调用 super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader) ;

调用“.toUrl()”可能会抛出MalformedURLException,因此编译以下代码...

public class loader extends URLClassLoader {
public static void main(String[] args)throws Exception{
Object localObject =
new loader(loader.class.getClassLoader(),
new File(loader.class.getProtectionDomain().getCodeSource()
.getLocation().getPath())
);
(...)
}

private loader(ClassLoader paramClassLoader, File paramFile){
super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader);

if (paramClassLoader == null)
throw new IllegalArgumentException("Error loading class");
}
}

错误:

loader.java:123: error: unreported exception MalformedURLException; must be caught or declared to be thrown
super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader);

如何捕捉这个异常?try-catch-block 是不可能的,因为“对 super 的调用必须是构造函数中的第一个语句”。

最佳答案

该异常实际上并不是由父类(super class)构造函数抛出的;而是由父类(super class)构造函数抛出的。它由 URI.toURL() 抛出(或至少声明为可能抛出),您在父类(super class)构造函数的参数中调用它。

一种选择是编写一个静态方法来将该异常转换为未经检查的异常:

private static URL convertFileToURL(File file) {
try {
return file.toURI().toURL();
} catch (MalformedURLException e) {
throw new RuntimeException("Unable to convert file to URL", e);
}
}

然后:

private loader(ClassLoader paramClassLoader, File paramFile){   
super(new URL[] { convertFileToURL(paramFile) }, paramClassLoader);

if (paramClassLoader == null)
throw new IllegalArgumentException("Error loading class");
}

假设您认为这基本上是不可能发生的事情,或者至少您不希望调用者关心。我对 URI.toURL 的了解还不够,无法知道它是否实际上与基于文件的 URI 相关。

如果调用者应该关心,因为它可能发生在现实生活中并且他们应该处理它(我认为这不太可能是诚实的),那么你应该声明你的构造函数可以抛出异常。

顺便说一句,请将您的类重命名为更有意义的名称,并遵循 Java 命名约定。

关于Java:从 super 构造函数捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17830004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com