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


当前回答

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

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

其他回答

在我的情况下,我有一个多模块项目和场景像com.xyz.TestClass是在模块a,以及在模块B和模块a依赖于模块B。因此,创建一个程序集jar,我认为只有一个版本的类被保留,如果没有调用的方法,然后我得到NoSuchMethodError运行时异常,但编译是好的。

相关网址:https://reflectoring.io/nosuchmethod/

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

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

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

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

来回答最初的问题。根据java文档:

"NoSuchMethodError"当应用程序试图调用类(静态或实例)的指定方法,而该类不再有该方法的定义时抛出。

通常,这个错误会被编译器捕获;只有当类的定义发生不兼容的更改时,此错误才会在运行时发生。

如果发生在运行时,检查包含该方法的类是否在类路径中。 检查是否添加了新版本的JAR,方法是否兼容。

为什么没有人提到依赖冲突?这个常见问题可能与包含不同版本的依赖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

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

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