为什么这个异常没有被捕获?

3
我有以下代码。
try {
   xpathInstance = XPath.newInstance(xpathExpr);
       list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
   throw new Exception(e);
}

我忘记包含一个是jdom.jar库依赖的库。当我运行应用程序时,我看到了这个错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at org.jdom.xpath.XPath.newInstance(XPath.java:134)
at com.myapp.parser.GenericXMLParser.getSingleNodeValue(GenericXMLParser.java:63)

根据JDOM文档,newInstance()方法会抛出JDOMEXCeption异常,那么难道它不应该捕获错误吗?
另外,我该如何避免添加catch(Exception e)子句来避免未知异常?
谢谢。
3个回答

4

该异常不是由构造函数引发的,而是由类加载器引发的。当类加载器尝试在构造函数运行之前长时间加载您的类时,如果找不到类,就会引发此异常(未找到类定义错误)。您没有处理此异常(顺便说一下,无法处理错误)。


通常会创建一个特定的类加载器来处理类加载器错误。 - Thorbjørn Ravn Andersen
1
哎?无论您使用默认的类加载器还是自定义的类加载器,如果您没有在类路径上实际指定所需的所有JAR包,它们都无法正常工作。 - MeBigFatGuy

4

我忘记包含一个jdom.jar库所依赖的库。当我运行应用程序时,我看到了这个错误。

你在运行时看到的错误是一个期望在CLASSPATH中的类未被找到而抛出的运行时错误。如果jdom.jar确实包括org/jaxen/NamespaceContext类,那么它应该可以解决这个问题。

根据JDOM文档,newInsance()方法会抛出JDOMEXCeption,那么它不应该捕获这个错误吗?

不,这不是一个JDOMException,而是一个NoClassDefFoundError,因此它不会被捕获。最重要的是,在JDOM类出现之前发生了这种情况——在类加载期间。

另外,我如何避免添加catch(Exception e)子句以避免未知异常?

一般情况下,您不应该尝试捕获NoClassDefFoundError,因为它是一种属于“无法恢复的失败”类别的错误类型。您可以尝试使用反射并捕获ClassNotFoundException来解决此问题,但总体而言,这是一种无法恢复的异常,因此尝试捕获它可能是没有意义的。

1

它没有被捕获,因为它没有被抛出。所抛出的异常是 java.lang.NoClassDefFoundError

如果你想要捕获一个异常,你必须去捕获它。没有什么可以避免这个问题,否则就失去了异常的意义。


根据文档,JDOMException扩展了“Exception”,所以NoClassDefFoundError也扩展了“Exception”,它不应该被捕获吗? - ziggy
父类型可以捕获任何子类型,但反过来则不可能。 - S M Kamran
@Ziggy:你不应该捕获像NoClassDefFoundError这样的异常(即使可能性很小)- 如果没有它,你的程序将无法正常工作。 - Richard H
@Ziggy:只有 Exception 的子类才能被捕获。 - S M Kamran
@ziggy,你对异常层次结构的理解是错误的。请参阅http://download.oracle.com/javase/tutorial/essential/exceptions/。 - Thorbjørn Ravn Andersen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接