如何修复nosuchmethoderror?

xmjla07d  于 2021-07-12  发布在  Java
关注(0)|答案(24)|浏览(351)

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

hjqgdpho

hjqgdpho1#

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

mnowg1ta

mnowg1ta2#

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

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()方法。
这个问题不是你经常遇到的,因为大多数人

pgky5nke

pgky5nke3#

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

nbysray5

nbysray54#

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

798qvoo8

798qvoo85#

我也遇到了类似的问题。

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中归档以解决问题。

bakd9h0s

bakd9h0s6#

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

llycmphe

llycmphe7#

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

cqoc49vn

cqoc49vn8#

我也犯了同样的错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
        at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
        at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)

为了解决这个问题,我首先检查了模块依赖关系图( click in your POM the combination -> Ctrl+Alt+Shift+U 或者 right click in your POM -> Maven -> Show dependencies )了解图书馆之间的冲突到底发生在哪里(intelij idea)。在我的特殊情况下,我有不同版本的Jackson依赖关系。


1) 因此,我直接在项目的pom中添加了这两个版本中的最高版本2.8.7。
在属性中:

<jackson.version>2.8.7</jackson.version>

作为依赖关系:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

2) 但也可以使用依赖排除来解决。
按照与示例中相同的原则:

<dependency>
      <groupId>group-a</groupId>
      <artifactId>artifact-a</artifactId>
      <version>1.0</version>
          <exclusions>
             <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
             </exclusion>
         </exclusions>
  </dependency>

具有不需要的版本的依赖项将从项目中排除。

zsbz8rwp

zsbz8rwp9#

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

2guxujil

2guxujil10#

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

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

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

lo8azlld

lo8azlld11#

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

pzfprimi

pzfprimi12#

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

bvjveswy

bvjveswy13#

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

ybzsozfc

ybzsozfc14#

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

esyap4oy

esyap4oy15#

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

相关问题