2012-03-10 107 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