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 文档, newInsance() 方法会抛出 JDOMEXCeption 所以它不应该捕获错误吗?

另外,我怎样才能避免必须添加一个 catch(Exception e) 子句来避免未知异常。

谢谢

4

3 回答 3

4

构造函数不会引发此异常。它是由类加载器提出的。当它试图在构造函数运行之前很久就加载您的类时,找不到该类并且引发了您尚未处理的此异常(未找到类定义错误)(无法处理 BTW 错误)。

于 2011-04-30T15:56:10.590 回答
4

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

您在运行时错误中看到的错误是为预期在CLASSPATH中但未找到的类引发的。如果jdom.jar确实包含org/jaxen/NamespaceContext类,那么应该可以解决这个问题。

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

不,这不是 a JDOMException,它是 a NoClassDefFoundError,因此它没有捕捉到它。最重要的是,这发生在 JDOM 类出现之前 - 发生在类加载期间。

另外,我怎样才能避免必须添加一个 catch(Exception e) 子句来避免未知异常

一般来说,您不应该尝试捕获NoClassDefFoundError,因为它是属于 failures from which recovery is not feasible. 您可以尝试通过使用反射和捕获来解决它,ClassNotFoundException但正如我所说,一般来说,这是一个您无法从中恢复的异常,因此尝试捕获它可能是一个有争议的问题。

于 2011-04-30T16:06:04.967 回答
1

它没有被抓住,因为它没有被扔掉。抛出的异常是java.lang.NoClassDefFoundError

如果你想捕捉一个异常,你必须捕捉它。您无法采取任何措施来避免这种情况,这会破坏整个异常点。

于 2011-04-30T15:53:49.600 回答