2013-07-24 33 views
0

我尝试编写我自己的加载类的加载类。Java:从超级构造函数捕获异常

因此,我也覆盖构造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 call必须是构造函数中的第一条语句”。

+1

一般来说,你应该避免在构造函数中发生任何类型的异常。为什么不传递paramFile.toURI()。toURL()作为构造函数的参数?通过这种方式,您可以在创建对象之前捕获异常。 –

回答

3

只需将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"); 
     } 
    } 
} 
+0

谢谢,这工作。我尝试了类似的(没有)工作,所以我没有看到只是添加(try-catch和throws)。问题解决了。 – CFP

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命名约定的内容。

+0

感谢您的解释。 – CFP

+0

@PKKG:请不要将对完全无关的帖子的引用添加为注释。 –