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


当前回答

大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。

最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror

其他回答

大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。

最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror

我在使用Intelij的Gradle项目中遇到了类似的问题。 我通过删除.gradle(见下面的截图)包和重建项目来解决这个问题。 .gradle包

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

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

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

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)

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

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