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


当前回答

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

其他回答

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

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

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

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

我也遇到过同样的问题。我改变了一个方法的返回类型,并运行了这个类的测试代码。这就是我面对这个NoSuchMethodError的时候。作为一种解决方案,在再次运行测试代码之前,我在整个存储库上运行了一次maven构建。这个问题在下一次测试运行中得到了解决。

大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。

最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror

我也遇到过类似的问题。

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或将其添加到类路径中。现在它会选择正确的。