为什么没有抓住这个例外

时间:2011-04-30 15:50:04

标签: java exception xpath exception-handling jdom

我有以下代码

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)子句以避免未知异常。

由于

3 个答案:

答案 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

如果你想捕获一个异常,你必须抓住它。没有什么可以做的,以避免这种情况,这将打破整个例外的点。