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


当前回答

注意,在反射的情况下,您将得到NoSuchMethodException,而对于非反射代码,您将得到NoSuchMethodError。当我面对其中一种和另一种时,我倾向于去看非常不同的地方。

其他回答

如果使用Maven或其他框架,并且您几乎随机地得到这个错误,请尝试像这样干净地安装…

clean install

如果您编写了对象并且知道它有方法,那么这种方法尤其可能工作。

为什么没有人提到依赖冲突?这个常见问题可能与包含不同版本的依赖jar有关。 详细解释及解决方法:https://dzone.com/articles/solving-dependency-conflicts-in-maven

简短的回答;

添加这个maven依赖项;

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
    <rules>
        <dependencyConvergence />
    </rules>
</configuration>
</plugin>

然后运行这个命令;

mvn enforcer:enforce

也许这就是你面临问题的原因。

我也犯了同样的错误:

  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>

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

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

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

NoSuchMethodError:我花了几个小时来修复这个问题,最终通过重命名包名来修复它,清洁和构建…尝试清洁构建首先,如果它不工作尝试重命名类名或包名和清洁构建…它应该被修复。祝你好运。