2011-04-30 53 views
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

我忘了包括圖書館 那是jdom.jar 庫的依賴。當我運行應用程序,我 看到了這個錯誤。

您在拋出該預計將在CLASSPATH但未發現了一類運行時錯誤看到的錯誤。如果jdom.jar確實包括org/jaxen/NamespaceContext類,那麼應該解決這個問題。

按照JDOM文檔, 的newInsance()方法拋出一個 JDOMEXCeption所以不應該有它抓住 的錯誤?

不,這不是一個JDOMException,這是一個NoClassDefFoundError,所以並沒有抓住它。 最重要的是,這發生在JDOM類在圖片之前 - 發生在類加載期間。

此外,我怎麼能避免添加 趕上(例外五)條款,以避免 未知異常

一般來說,你應該試圖抓住NoClassDefFoundError,因爲它是一種類型屬於failures from which recovery is not feasible類別的錯誤。你可以嘗試通過使用反射和捕捉ClassNotFoundException來解決它,但正如我所說,這是一個例外,你不能從中恢復,所以試圖捕捉它可能是一個有爭議的問題。

1

它沒有被捕獲,因爲它沒有被拋出。拋出的異常是java.lang.NoClassDefFoundError

如果你想捕捉一個異常,你必須抓住它。沒有什麼可以做的,以避免這種情況,這將有點挫敗例外的全部點。

+0

嗨,根據文檔,JDOMException擴展了「Exception」,所以它不應該被捕獲,因爲NoClassDefFoundError也擴展了「Exception」? – ziggy 2011-04-30 15:56:50

+0

父類型可以捕獲任何子類型,但反之亦然是不可能的 – 2011-04-30 15:58:01

+0

確定這是否意味着要捕獲這些unkownn異常,我必須在try/catch子句末尾添加catch(Exception e)? – ziggy 2011-04-30 15:58:10

4

這個異常不是由構造函數引發的。它是由類加載器提出的。當它試圖在構造函數運行之前很久以前加載類時,找不到該類,並且引發了您未處理的異常(無類定義發現錯誤)(無法處理BTW錯誤)。

+0

通常創建一個特定的類加載器來處理類加載器錯誤。 – 2011-04-30 16:07:05

+1

呵呵?無論您使用默認的類加載器還是自定義類,如果您沒有實際指定類路徑中所需的所有jar,它們將不起作用。 – MeBigFatGuy 2011-04-30 17:25:20