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


当前回答

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

其他回答

如果您的文件名与包含main方法的类名不同,则可能会导致此错误。

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

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

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

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

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

这也可以是使用反射的结果。如果你的代码反映了一个类,并通过名称提取了一个方法(例如:with class。getDeclaredMethod("someMethodName", .....)),那么每当方法名称发生变化时,例如在重构期间,您将需要记住更新反射方法的参数以匹配新的方法签名,否则getDeclaredMethod调用将抛出NoSuchMethodException。

如果这是原因,那么堆栈跟踪应该显示调用反射方法的点,您只需要更新参数以匹配实际的方法签名。

根据我的经验,当单元测试私有方法/字段,并使用TestUtilities类提取字段以进行测试验证时,偶尔会出现这种情况。(通常在设计时没有考虑到单元测试的遗留代码。)

我在使用Intelij的Gradle项目中遇到了类似的问题。 我通过删除.gradle(见下面的截图)包和重建项目来解决这个问题。 .gradle包