2014-11-23 88 views
3

我正在尝试执行java类加载。我在macos优胜美地上使用了日食(luna)和1.8.0_25。Try/Catch没有捕捉异常

我正在使用下面的代码来完成它。它正在工作,直到它到达一个具有依赖项的类,该依赖项不包含在我从中加载类的jar中。无论在环境上。

我对这个类不感兴趣,所以,可以放心地忽略它。所以,我把它放在一个try/catch里面,然后把它记录下来。

但是,当发生异常时,执行被取消。

异常(总结)为:

Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/runtime/internal/AroundClosure 

Caused by: java.lang.ClassNotFoundException: org.aspectj.runtime.internal.AroundClosure 

它上升时即内try/catch块内的确切的行。

为什么? try/catch不应该只记录它并继续前进吗?

URLClassLoader ucl = null; 
try { 
    URL url = Utils.getURIFromPath(jarFilePath).toURL(); 
    URL[] urls = new URL[] { url }; 
    ucl = new URLClassLoader(urls); 
    for (String tmp : classes) { 
     String clazz = tmp.substring(0, tmp.indexOf(".class")).replaceAll("/", "."); 
     try { 
      ucl.loadClass(clazz); 
     } catch (Exception e) { 
      LOGGER.error(e.getMessage(), e); 
     } 
    } 
} catch (MalformedURLException e) { 
    LOGGER.error(e.getMessage(), e); 
} finally { 
    if (ucl != null) { 
     try { 
      ucl.close(); 
     } catch (IOException e) { 
      LOGGER.error(e.getMessage(), e); 
     } 
    } 
} 
+1

这对堆栈跟踪呢?引起:java.lang.ClassNotFoundException – committedandroider 2014-11-23 07:23:45

+2

修复你的类路径。你似乎缺少了aspectj.jar。 – 2014-11-23 07:23:46

+1

这是真的吗?该行以'Exception in thread'开始 – user3282276 2014-11-23 07:23:50

回答

6

NoClassDefFoundError错误,不是Exception,你应该永远 尝试catch错误,as stated here,抓住它不会帮你的。

检查你的类路径并修复它。

在某些情况下,你可能想catch错误,并相应地处理它,就像在评论中指出,也许“从未”强一点点

+2

从来没有一个强大的词。 try { array = new byte [bufsize]; }赶上(最终的OutOfMemoryError E){// ... } 似乎完全没和我在一起。 – 2014-11-23 07:32:09

2

好吧那就试试这个:

catch (Throwable e) { 
LOGGER.error(e.getMessage(), e); 
} 

虽然使用上面的代码将同时处理错误和异常为你(无论是从Throwable延长),但它不是做正确的方式,只有在非常特殊的情况下做我们处理使用的try-catch错误,错误是一些我们需要检查我们的代码并解决它们。

+1

捕捉错误不会修复它。它只会隐藏它。 OP需要修复它的类路径。捕捉Throwble是一个不好的习惯,不会解决任何问题。 – 2014-11-23 07:29:35

+1

@JB不是真正的男人,但这家伙似乎只是抓住了错误,并没有以正确的方式解决它,所以我发布了这个解决方案,我想我应该编辑我的答案并告诉他。 – 2014-11-23 07:32:43

1

看来,类之一,您使用,可能是你想用loadClass加载类之一,拥有依赖上课从的AspectJ,但类加载器没有找到AspectJ类。一个可能的解决方案是确保当您执行此操作时,AspectJ在您的类路径上。

也可能是AspectJ已经在类路径中。如果是这样的话,那只是你的URLClassLoader不知道你的ClassPath。为什么程序不正义之举是,你赶上Exception

ucl = new URLClassLoader(urls, getClass().getClassLoader()); 

原因:您可能需要与家长ClassLoader构建URLClassLoader到位,是这样的。层次结构为class Throwable,class Exception extends Throwableclass Error extends Throwable,因此catch (Exception e)不会捕获Error。在这种特殊情况下,您可能需要使用catch(Exception | NoClassDefFoundError e)。通常,捕捉错误并不是一个好主意,但有时对于像NoClassDefFoundError,OutOfMemoryErrorStackOverflowError这样的错误有合理的例外。