【问题标题】:How to catch NoSuchMethodException如何捕获 NoSuchMethodException
【发布时间】:2012-03-27 19:04:38
【问题描述】:

我正在尝试反序列化包含方法的 XML 文件。 片段看起来像:

 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.beans.Statement$1.run(Statement.java:130) 在 java.security.AccessController.doPrivileged(AccessController.java:284) 在 java.beans.Statement.invokeMethod(Statement.java:127) 在 java.beans.Expression.getValue(Expression.java:67) 在 java.beans.XMLDecoder$SAXHandler.executeCommon(XMLDecoder.java:392) 在 java.beans.XMLDecoder$SAXHandler.execute(XMLDecoder.java:321) 在 java.beans.XMLDecoder$SAXHandler.endElement(XMLDecoder.java:286) 在 org.apache.xerces.parsers.AbstractSAXParser.endElement(未知来源) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(未知 资源) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(未知 资源) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知 资源) 在 org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 在 org.apache.xerces.parsers.XML11Configuration.parse(未知来源)在 org.apache.xerces.parsers.XMLParser.parse(未知来源)在 org.apache.xerces.parsers.AbstractSAXParser.parse(未知来源)
在 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知 来源)在 org.apache.xerces.jaxp.SAXParserImpl.parse(未知来源) 在 javax.xml.parsers.SAXParser.parse(Unknown Source) 在 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>

【问题讨论】:

  • 哦,我明白了,因为 readObject() 没有被声明为抛出 NoSuchMethodException Java 认为不可能发生这种情况,请尝试在 NoSuchMethodException 之后添加一个默认异常块.我会把它添加到我下面的帖子中。
  • 代码中肯定有其他你没有发布的东西。根据错误消息readObject()不是异常的根本原因,所以它必须来自不同的语句
  • 你能发布序列化对象的 XML 版本吗?那里肯定发生了什么事。
  • @Hunter 添加了 XML 版本。

标签: java xml exception


【解决方案1】:

为什么你不能捕捉到这个异常?

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;

【讨论】:

  • 当我放入 try {NoSuchMethoException} catch {} 块时,编译器显示 NoSuchMethodException 的无法到达的 catch 块。并且使用 try {Exception} 捕获根本无法捕获。
  • 您可以发布您尝试做的事情吗?因为你说的没有道理
  • 你能把它贴在你的问题中吗?,评论让它很难阅读。
【解决方案2】:

如果由于某种原因“catch (Exception e)”不起作用,请尝试:

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

这应该捕获所有可能的异常和错误,因为它是所有异常的基类。

【讨论】:

  • 你不应该那样做。这可能会导致很难找到错误。
  • 只有在你真正知道自己在做什么的情况下才应该这样做。他也可以这样做:catch (Throwable t) { if (!(t instanceof NoSuchMethodException)) { throw t; } }
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 2018-07-31
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多