我有以下代码
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)子句以避免未知异常。
由于
答案 0 :(得分:4)
构造函数不会引发此异常。它是由类加载器引发的。当它在构造函数运行之前很久就尝试加载你的类时,找不到类,并且引发了这个异常(No Class Defination Found Error)你没有处理过(无法处理BTW错误)。
答案 1 :(得分:4)
我忘了包括一个图书馆 这是jdom.jar的依赖 图书馆。当我运行应用程序时 看到了这个错误。
您在为 CLASSPATH 但未找到的类中抛出的运行时错误中看到的错误。如果jdom.jar
确实包含org/jaxen/NamespaceContext
类,则应解决此问题。
根据JDOM文档, newInsance()方法抛出一个 JDOMEXCeption也不应该有 发现了错误?
不,这不是JDOMException
,它是NoClassDefFoundError
,因此它无法捕获它。 最重要的是,这发生在JDOM类出现之前 - 在类加载过程中发生。
另外,我怎样才能避免添加 catch(Exception e)条款要避免 未知的例外
一般情况下,不会尝试捕获NoClassDefFoundError,因为它是属于failures from which recovery is not feasible
类别的错误类型。您可以尝试使用Reflection并捕获ClassNotFoundException
来解决它,但正如我所说的那样,这是一个您无法恢复的异常,因此尝试捕获它可能是一个没有实际意义的点。
答案 2 :(得分:1)
它没有被捕获,因为它没有被抛出。引发的异常是java.lang.NoClassDefFoundError
如果你想捕获一个异常,你必须抓住它。没有什么可以做的,以避免这种情况,这将打破整个例外的点。