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


当前回答

我也遇到过这种错误。

我的问题是我改变了一个方法的签名,就像这样

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()方法。

您可能不会经常遇到这个问题,因为最常见的情况是手动重新构建项目或自动触发Build操作,而不仅仅是编译一个修改过的类。

我的用例是,我生成了一个.jar文件,它是用来作为一个热修复,不包含App.class,因为这是没有修改。对我来说,不包含它是有意义的,因为我通过继承保留了初始参数的基类。

问题是,当你编译一个类时,产生的字节码是静态的,换句话说,它是一个硬引用。

原始的分解字节码(由javap工具生成)如下所示:

 #7 = Methodref          #2.#22         // Bank.invest:(LCurrency;)V

在ClassLoader加载新的编译后的Bank.class后,它将找不到这样一个方法,它看起来好像它被删除了而没有被更改,因此出现了命名错误。

希望这能有所帮助。

其他回答

以上答案解释得很好。再补充一点 如果你正在使用eclipse,使用ctrl+shift+T并输入类的包结构(例如:gateway.smpp.PDUEventListener),你会找到它存在的所有jar /项目。从类路径中删除不必要的jar或将其添加到类路径中。现在它会选择正确的。

我也犯了同样的错误:

  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)

为了解决这个问题,我检查了,首先,模块依赖关系图(在你的POM中单击组合-> Ctrl+Alt+Shift+U或右键单击你的POM -> Maven ->显示依赖关系),以了解库之间的冲突到底在哪里(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>

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

我也有你的问题,我就是这么解决的。下面的步骤是添加库的一种工作方式。我已经正确地完成了前两个步骤,但是我没有完成最后一个步骤,即直接将“.jar”文件从文件系统拖到eclipse项目的“lib”文件夹中。此外,我必须从构建路径和“lib”文件夹中删除之前版本的库。

步骤1 -添加.jar构建路径

步骤2 -关联源和javadocs(可选)

步骤3 -实际拖动。jar文件到“lib”文件夹(非可选)

我也遇到过同样的问题。当类中存在模糊性时,也会出现这种情况。我的程序试图调用一个方法,该方法存在于两个JAR文件中,位于相同的位置/类路径。删除一个JAR文件或只使用一个JAR文件来执行代码。检查您使用的不是相同的JAR,也不是包含相同类的同一个JAR的不同版本。

DISP_E_EXCEPTION [step] [] [Z-JAVA-105 Java异常Java .lang. nosuchmethoderror (com.example.yourmethod)]

试试这种方法:删除项目目录下的所有.class文件(当然,还有所有子目录)。重建。

有时mvn clean(如果您使用maven)不会清除javac手动创建的.class文件。这些旧文件包含旧签名,导致NoSuchMethodError。