0

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

因此,我还重写了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 的调用必须是构造函数中的第一条语句”。

4

2 回答 2

7

超类构造函数实际上并没有抛出异常;它被 抛出(或至少声明为可能抛出)URI.toURL(),您在超类构造函数的参数中调用它。

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

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 命名约定的更有意义的名称。

于 2013-07-24T09:28:23.130 回答
3

只需将 throws MalformedURLException 添加到加载器构造函数并使用 try catch 块将代码包装在 main 方法中。

public class loader extends URLClassLoader {

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

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

        if (paramClassLoader == null) {
            throw new IllegalArgumentException("Error loading class");
        }
    }
}
于 2013-07-24T09:29:20.550 回答