Java 为什么这个例外没有被发现

Java 为什么这个例外没有被发现,java,exception,xpath,exception-handling,jdom,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

我有以下代码

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文档,newInAsance()方法抛出一个JDOmeException,所以它不应该捕获错误吗

另外,如何避免必须添加catch(Exception e)子句来避免未知的异常


谢谢

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


如果你想捕捉一个异常,你必须捕捉它。您无法避免这种情况,这可能会破坏整个异常点。

此异常不是由构造函数引发的。它是由类装入器引发的。当它在构造函数运行之前很久尝试加载您的类时,未找到该类,并且引发了您尚未处理的异常(未找到类定义错误)(顺便说一句,无法处理错误)

我忘了包括一个图书馆 这是jdom.jar的一个依赖项 图书馆。当我运行应用程序时,我 我看到了这个错误

您在为类抛出的运行时错误中看到的错误,该类应位于类路径中,但未找到。如果
jdom.jar
确实包含
org/jaxen/NamespaceContext
类,那么应该可以解决这个问题

根据JDOM文档, newInsance()方法抛出一个 这是一个例外,它不应该有吗 发现错误了吗

不,这不是一个
JDOMException
,它是一个
NoClassDefFoundError
,因此它无法捕获它最重要的是,这发生在JDOM类出现之前-发生在类加载期间

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


一般情况下,您应该尝试捕获,因为这是属于
故障类别的一种错误,恢复不可行。您可以尝试使用反射和捕获
ClassNotFoundException
来解决这个问题,但正如我所说的,一般来说,这是一个无法从中恢复的异常,因此尝试捕获它可能是一个没有意义的问题。

嗨,根据文档,jdomeexception扩展了“异常”所以不应该捕获它,因为NoClassDefFoundError也扩展了“Exception”?父类型可以捕获任何子类型,但反之亦然。确定这是否意味着要捕获这些未知的异常,我必须在try/catch子句的末尾添加catch(Exception e)?两个方面都没有。1) catch将只捕获JDOMException类型的异常和任何子类。NoClassDefFoundError不是JDomeException的子类。2) 无论如何,这里没有抛出异常,它是由classloader抛出的。NoClassDefFoundError不扩展“异常”。但即使它这样做了,它也不会被捕获在
catch JDOMException
子句中。它也不会被捕获在
catch Exception
子句中…通常创建一个特定的类加载器来处理类加载器错误。哈?无论您使用默认类加载器还是自定义类加载器,如果您没有实际指定类路径上所需的所有JAR,它们都将无法工作。