如何修复nosuchmethoderror?

bpzcxfmw  于 2021-07-24  发布在  Java
关注(0)|答案(24)|浏览(411)

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

7gs2gvoe

7gs2gvoe1#

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

jmo0nnb3

jmo0nnb32#

我也遇到过这个错误。
我的问题是我更改了一个方法的签名,比如

void invest(Currency money){...}

进入

void invest(Euro money){...}

此方法是从类似的上下文调用的

public static void main(String args[]) {
    Bank myBank = new Bank();

    Euro capital = new Euro();
    myBank.invest(capital);
}

编译器对警告/错误保持沉默,因为资本既是货币也是欧元。
出现这个问题的原因是,我只编译了在其中定义方法的类-bank,而没有编译从中调用方法的类,该类包含main()方法。
这个问题并不是你经常遇到的,最常见的是项目

xxhby3vn

xxhby3vn3#

大多数情况下,java.lang.nosuchmethoderror是由编译器捕获的,但有时它可能发生在运行时。如果此错误发生在运行时,那么唯一的原因可能是类结构中的更改使其不兼容。
最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror

1tuwyuhd

1tuwyuhd4#

我也有同样的问题。当类中存在歧义时,也会导致这种情况。我的程序试图调用一个方法,该方法存在于同一位置/类路径中的两个jar文件中。删除一个jar文件或执行代码,以便只使用一个jar文件。请检查您使用的不是同一个jar或包含同一类的同一jar的不同版本。
disp\u e\u exception[step][][z-java-105 java exception java.lang.nosuchmethoderror(com.example.yourmethod)]

yhxst69z

yhxst69z5#

我也遇到了类似的问题。

Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I

最后我确定了根本原因是更改了变量的数据类型。 Employee.java -->包含变量( EmpId )其数据类型已从 intString . ReportGeneration.java -->使用getter检索值, getEmpId() .
我们应该通过只包含修改过的类来重新处理jar。因为没有变化 ReportGeneration.java 我只是把 Employee.class 在jar文件中。我必须包括 ReportGeneration.class 在jar中归档以解决问题。

gkn4icbw

gkn4icbw6#

上面的答案解释得很好。如果您正在使用eclipse,只需添加一件事,即使用ctrl+shift+t并输入类的包结构(例如:gateway.smpp.pdueventlistener),您将在它所在的位置找到所有jar/项目。从类路径中删除不必要的jar或在类路径中添加上面的jar。现在它将选择正确的一个。

dkqlctbz

dkqlctbz7#

我在更改应用程序中的方法签名时遇到了类似的问题。清理和重建我的项目解决了“nosuchmethoderror”。

uyto3xhc

uyto3xhc8#

只是补充现有答案。我在eclipse中遇到了这个问题。我换了一个班,做了以下步骤,
在eclpise清洁和建造项目
mvn清洁安装
重新启动tomcat
但我仍然面临着同样的错误。然后我清理了tomcat,清理了tomcat的工作目录,重新启动了服务器,我的问题就消失了。希望这对别人有帮助

jutyujz0

jutyujz09#

我在eclipse中通过重命名junit测试文件修复了这个问题。
在我的eclipse工作空间中,我有一个应用程序项目和一个测试项目。
测试项目将应用程序项目作为生成路径上的必需项目。
开始获取nosuchmethoderror。
然后我意识到测试项目中的类与应用程序项目中的类具有相同的名称。

App/  
  src/
     com.example/  
       Projection.java
Test/  
  src/
     com.example/
       Projection.java

将测试重命名为正确的名称“projectiontest.java”之后,异常就消失了。

5n0oy7gb

5n0oy7gb10#

回答最初的问题。根据java文档:
如果应用程序试图调用类(静态或示例)的指定方法,而该类不再具有该方法的定义,则抛出“nosuchmethoderror”。
通常,这个错误被编译器捕获;只有在类的定义发生不兼容的更改时,才能在运行时发生此错误。
如果发生在运行时,请检查包含该方法的类是否在类路径中。
检查您是否添加了新版本的jar,并且方法是否兼容。

py49o6xq

py49o6xq11#

这些问题是由于在相同的两个类中使用相同的对象造成的。使用的对象不包含新对象类包含的新方法。
前任:

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相似类引起的(src中1个,jar文件中1个是gateway.jar)

gg58donl

gg58donl12#

尝试以下方法:删除项目目录下的所有.class文件(当然还有所有子目录)。重建。
有时 mvn clean (如果您使用的是maven)不清除由手动创建的.class文件 javac . 那些旧文件包含旧签名,导致 NoSuchMethodError .

evrscar2

evrscar213#

如果没有更多的信息,很难找出问题所在,但根本原因是您很可能是针对缺少方法的类的不同版本编译了一个类,而不是针对运行该类时使用的版本。
看看堆栈跟踪。。。如果在对库中的对象调用方法时出现异常,则在编译和运行时很可能使用不同版本的库。确保两个地方都有正确的版本。
如果在调用由您创建的类示例化的对象的方法时出现异常,那么您的构建过程似乎是错误的。确保编译时更新了实际运行的类文件。

wnrlj8wa

wnrlj8wa14#

这意味着类中不存在相应的方法:
如果您使用的是jar,那么反编译并检查jar的各个版本是否有正确的类。
检查是否从源代码编译了正确的类。

m2xkgtsf

m2xkgtsf15#

在我的情况下,我有一个多模块的项目和场景是这样的 com.xyz.TestClass 在模块中 A 以及在模块中 B 和模块 A 依赖于模块 B . 因此,在创建程序集jar时,我认为只保留了类的一个版本,如果没有调用的方法,那么 NoSuchMethodError 运行时异常,但编译正常。
相关:https://reflectoring.io/nosuchmethod/

相关问题