Java 如何捕获NoSuchMethodException
我正在尝试反序列化包含方法的XML文件。 代码段如下所示:Java 如何捕获NoSuchMethodException,java,xml,exception,Java,Xml,Exception,我正在尝试反序列化包含方法的XML文件。 代码段如下所示: XMLDecoder decoder = new XMLDecoder(os); deSerializedObject = decoder.readObject(); decoder.close(); return deSerializedObject; 当XML文件不包含每个对象的方法时。它抛出NoSuchMethodException@readObject java.lang.NoSuchMethod
XMLDecoder decoder = new XMLDecoder(os);
deSerializedObject = decoder.readObject();
decoder.close();
return deSerializedObject;
当XML文件不包含每个对象的方法时。它抛出NoSuchMethodException@readObject
java.lang.NoSuchMethodException:未找到名为add的方法
位于java.beans.Statement.findMethod(Statement.java:454)
位于java.beans.Statement.invokeMethodImpl(Statement.java:247)
在java.beans.Statement.access$000(Statement.java:46)
在java.security.AccessController.doPrivileged(AccessController.java:284)的java.beans.Statement$1.run(Statement.java:130)
位于java.beans.Statement.invokeMethod(Statement.java:127)
位于java.beans.Expression.getValue(Expression.java:67)的java.beans.xmldecorder$SAXHandler.executeCommon(xmldecommon.java:392)
在java.beans.XMLDecoder$SAXHandler.execute(XMLDecoder.java:321)
位于java.beans.xmldecover$SAXHandler.endElement(xmldecover.java:286)
org.apache.xerces.parsers.AbstractSAXParser.endElement(未知源)
位于org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.ScannedElement(未知
(来源)
位于org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(未知
(来源)
位于org.apache.xerces.impl.XMLDocumentFragmentScanneImpl.ScandDocument(未知
(来源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
org.apache.xerces.parsers.XML11Configuration.parse(未知源代码)位于
org.apache.xerces.parsers.XMLParser.parse(未知源代码)位于
org.apache.xerces.parsers.AbstractSAXParser.parse(未知源)位于org.apache.xerces.jaxp.SAXParserImpl$jaxpsaxpasser.parse(未知 源代码)位于org.apache.xerces.jaxp.SAXParserImpl.parse(未知源代码) 位于javax.xml.parsers.SAXParser.parse(未知源代码)处的java.beans.xmldecorder.readObject(xmldecorder.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>
杰伊
10
Hir
10
为什么您不能捕获此异常
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;
如果出于某种原因,“捕获(异常e)”不起作用,请尝试:
try {
...
} catch (Throwable t) {
...
}
这应该捕获所有可能的异常和错误,因为它是所有异常的基类。当我放置try{NoSuchMethodException}catch{}块时,编译器说NoSuchMethodException的catch块不可访问。用try{Exception}catch根本就不能捕获。你能发布你想做的事情吗?因为你所说的没有意义。你可以把它贴在你的问题上吗?评论让人很难阅读。你永远不应该这样做。这可能会导致很难找到bug。只有当你真的知道自己在做什么时才应该这样做。他也可以这样做:catch(Throwable t){if(!(t instanceof NoSuchMethodException)){throw t;}}哦,我明白了,因为
readObject()
没有声明抛出NoSuchMethodException
Java认为这种情况不太可能发生,尝试在NoSuchMethodException
块之后添加默认异常块。我将把它添加到我下面的帖子中。代码中肯定还有一些你没有发布的东西。根据错误消息readObject()
不是异常的根本原因,因此它必须来自不同的语句。您可以发布序列化对象的XML版本吗?“一定有什么事情发生了。”亨特添加了XML版本。