2012-03-10 150 views
2

我想反序列化包含方法的XML文件。 片段看起來像:如何捕捉NoSuchMethodException

XMLDecoder decoder = new XMLDecoder(os); 
    deSerializedObject = decoder.readObject(); 
    decoder.close(); 
    return deSerializedObject; 

當XML文件不包含每一個object.It方法拋出NoSuchMethodException @的readObject。

java.lang.NoSuchMethodException:沒有與名稱添加方法找到 在java.beans.Statement.findMethod(Statement.java:454) 在java.beans.Statement.invokeMethodImpl(Statement.java:247 )java.beans.Statement.access處的 $ java.beans.Statement上的$ 000(Statement.java:46) java.security.AccessController.doPrivileged(AccessController.java:284)處的$ 1.run(Statement.java:130) java.beans.Statement.invokeMethod上的 (Statement.java:127) at java.beans.Expression.getValue(Expression.java:67)at java.beans.XMLDecoder $ SAXHandler.executeCommon(XMLDecoder.java:392) 在java.beans.XMLDecoder $ SAXHandler.execute(XMLD ecoder.java:321) at java.beans.XMLDecoder $ SAXHandler.endElement(XMLDecoder.java:286)at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at org.apache.xerces.impl .XMLDocumentFragmentScannerImpl.scanEndElement(未知 來源) 在org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDispatcher.dispatch(未知 來源) 在org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知 來源) 在組織.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)a牛逼 org.apache.xerces.parsers.AbstractSAXParser.parse(來源不明)
在org.apache.xerces.jaxp.SAXParserImpl $ JAXPSAXParser.parse(未知 來源)在org.apache.xerces.jaxp.SAXParserImpl.parse (來源不明) 在javax.xml.parsers.SAXParser.parse(來源不明)在java.beans.XMLDecoder.readObject(XMLDecoder.java:662)

問題是我不能趕上這個例外。處理它的正確方法是什麼?

try{ 
     deSerializedObject = decoder.readObject(); 
     System.out.println("We are after read object"); 
     } 
     catch (NoSuchMethodException e) 
     { 
      System.out.println("We are in catch block !!"); 
      e.printStackTrace(); 
     } 
     decoder.close(); 
     return deSerializedObject; 

這裏的錯誤是 「爲NoSuchMethodException無法到達的catch塊。這個異常是永遠不會從try語句體拋出」

XML看起來

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0" class="java.beans.XMLDecoder"> 
<object class="java.util.ArrayList"> 
    <void method="add"> 
    <object class="InfoParameters"> 
    <void property="Name"> 
    <string>Jay</string> 
    </void> 
    <void property="Level"> 
    <string>10</string> 
    </void> 
    </object> 
    <object class="InfoParameters"> 
    <void property="Name"> 
    <string>Hir</string> 
    </void> 
    <void property="Level"> 
    <string>10</string> 
    </void> 
    </object> 
    </void> 
</object> 
</java> 
+0

呵呵我明白了,因爲'readObject()'沒有被聲明爲拋出'NoSuchMethodException',Java並不認爲這可能發生,所以嘗試在'NoSuchMethodException'之後添加一個默認的異常塊。我會將它添加到我的帖子下面。 – 2012-03-10 19:26:59

+0

你還沒有發佈的代碼中還有其他內容。根據錯誤消息'readObject()'不是異常的根本原因,所以它必須來自不同的語句 – 2012-03-10 19:46:43

+0

您可以發佈序列化對象的XML版本嗎?必須有一些事情發生在那裏。 – 2012-03-10 20:07:15

回答

3

你爲什麼不能趕上這個異常?

XMLDecoder decoder = new XMLDecoder(os); 

try 
{ 
    deSerializedObject = decoder.readObject(); 
} 
catch(NoSuchMethodException nsme) 
{ 
    System.err.println(nsme.getMessage()); 
} 
catch(Exception e) 
{ 
    //try me 
} 

decoder.close(); 
return deSerializedObject; 
+0

當我嘗試{NoSuchMethoException} catch {}塊時,Compiler表示NoSuchMethodException的Unreachable catch塊。並嘗試{例外}趕上根本不捕捉。 – 2012-03-10 18:54:47

+0

你可以發佈你試圖做什麼?因爲你所說的沒有意義 – 2012-03-10 19:03:00

+0

你可以在你的問題中發表嗎?,這個評論使得它很難閱讀。 – 2012-03-10 19:15:03

0

如果由於某種原因「趕上(例外五)」不工作的嘗試:

try { 
    ... 
} catch (Throwable t) { 
    ... 
} 

這應該抓住每一個可能的異常和錯誤,因爲它是所有異常的基類。

+4

你永遠不應該那樣做。這可能會導致很難發現錯誤。 – DerMike 2012-03-10 19:09:58

+0

只有當你真的知道自己在做什麼時才應該這樣做。 他也可以這樣做: catch(Throwable t){if(!(t instanceof NoSuchMethodException)){ throw t; } } – 2012-03-10 19:32:55