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


当前回答

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

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

其他回答

这通常是在使用像Apache Ant这样的构建系统时引起的,该构建系统只在java文件比类文件更新时才编译java文件。如果方法签名发生了变化,并且类使用了旧版本,则可能无法正确编译。通常的修复方法是做一个完整的重建(通常是“ant clean”然后“ant”)。

有时,当针对一个库版本进行编译,但针对不同的版本运行时,也会导致这种情况。

我也遇到过类似的问题。

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

最后,我发现根本原因是改变了变量的数据类型。

java——>包含数据类型从int改为String的变量(EmpId)。 使用getter getEmpId()检索值。

我们应该通过只包含修改过的类来重新打包jar。由于在ReportGeneration.java中没有任何变化,我只是在Jar文件中包含了Employee.class。我必须在jar中包含ReportGeneration.class文件来解决这个问题。

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

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

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

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

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

在没有更多信息的情况下,很难确定问题,但根本原因是您很可能针对缺少方法的类的不同版本编译了一个类,而不是您在运行时使用的类。

查看堆栈跟踪…如果在对库中的对象调用方法时出现异常,则很可能在编译和运行时使用了该库的不同版本。确保这两个地方都有正确的版本。

如果在对由您创建的类实例化的对象调用方法时出现异常,那么您的构建过程似乎是错误的。确保在编译时更新了实际运行的类文件。