我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?


当前回答

在我的情况下,我有一个多模块项目和场景像com.xyz.TestClass是在模块a,以及在模块B和模块a依赖于模块B。因此,创建一个程序集jar,我认为只有一个版本的类被保留,如果没有调用的方法,然后我得到NoSuchMethodError运行时异常,但编译是好的。

相关网址:https://reflectoring.io/nosuchmethod/

其他回答

这通常是在使用像Apache Ant这样的构建系统时引起的,该构建系统只在java文件比类文件更新时才编译java文件。如果方法签名发生了变化,并且类使用了旧版本,则可能无法正确编译。通常的修复方法是做一个完整的重建(通常是“ant clean”然后“ant”)。

有时,当针对一个库版本进行编译,但针对不同的版本运行时,也会导致这种情况。

这些问题是由在相同的两个类中使用相同的对象引起的。 所使用的对象不包含已添加新对象类包含的新方法。

ex:

filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) ) 
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
        at gateway.smpp.USSDClient.bind(USSDClient.java:139)
        at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
        at gateway.USSDGW.<init>(USSDGW.java:184)
        at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)

-bash-3.00$ 

这些问题是由伴随的02相似类引起的(1在src, 1在jar文件这里是gateway.jar)

这意味着相应的方法在类中不存在:

如果您正在使用jar,那么反编译并检查jar的各个版本是否有适当的类。 检查是否从源代码编译了正确的类。

对我来说,它发生了,因为我改变了函数中的参数类型,从对象a,到字符串a。我可以用清洁和重新构建来解决它

我刚刚通过重新启动Eclipse并运行应用程序解决了这个错误。 我的情况可能是因为我在没有关闭项目或Eclipse的情况下替换了源文件。 这导致了我使用的不同版本的类。