我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?
当前回答
在没有更多信息的情况下,很难确定问题,但根本原因是您很可能针对缺少方法的类的不同版本编译了一个类,而不是您在运行时使用的类。
查看堆栈跟踪…如果在对库中的对象调用方法时出现异常,则很可能在编译和运行时使用了该库的不同版本。确保这两个地方都有正确的版本。
如果在对由您创建的类实例化的对象调用方法时出现异常,那么您的构建过程似乎是错误的。确保在编译时更新了实际运行的类文件。
其他回答
我也遇到过同样的问题。我改变了一个方法的返回类型,并运行了这个类的测试代码。这就是我面对这个NoSuchMethodError的时候。作为一种解决方案,在再次运行测试代码之前,我在整个存储库上运行了一次maven构建。这个问题在下一次测试运行中得到了解决。
大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。
最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror
对我来说,这里提到的解决办法没有一个是没用的。
将模拟核从3.3.3更新到3.4.3修复了这个问题。
我认为这是由于MockitoAnnotations.initMock()方法在Mockito JUnit 5 version 3中被弃用并被MockitoAnnotations.openMocks()所取代。
另一方面,检查本地Maven Repository并删除可能导致冲突的不必要的jar可能是值得的。但在使用此步骤时,请注意,不要删除手动安装的(或在操作前备份)。
如果您的文件名与包含main方法的类名不同,则可能会导致此错误。
我也遇到过这种错误。
我的问题是我改变了一个方法的签名,就像这样
void invest(Currency money){...}
成
void invest(Euro money){...}
从类似于的上下文调用此方法
public static void main(String args[]) {
Bank myBank = new Bank();
Euro capital = new Euro();
myBank.invest(capital);
}
编译器对警告/错误保持沉默,因为资本既是货币也是欧元。
出现问题的原因是,我只编译了定义方法的类- Bank,而没有编译调用方法的类,其中包含main()方法。
您可能不会经常遇到这个问题,因为最常见的情况是手动重新构建项目或自动触发Build操作,而不仅仅是编译一个修改过的类。
我的用例是,我生成了一个.jar文件,它是用来作为一个热修复,不包含App.class,因为这是没有修改。对我来说,不包含它是有意义的,因为我通过继承保留了初始参数的基类。
问题是,当你编译一个类时,产生的字节码是静态的,换句话说,它是一个硬引用。
原始的分解字节码(由javap工具生成)如下所示:
#7 = Methodref #2.#22 // Bank.invest:(LCurrency;)V
在ClassLoader加载新的编译后的Bank.class后,它将找不到这样一个方法,它看起来好像它被删除了而没有被更改,因此出现了命名错误。
希望这能有所帮助。
推荐文章
- 我如何修复一个NoSuchMethodError?
- Maven surefire找不到ForkedBooter类
- Java 8:我如何在流中使用异常抛出方法?
- 去下一次迭代在java For循环
- 在Java中使用什么数据类型来表示钱?
- Class.getResource()和ClassLoader.getResource()之间的区别是什么?
- 如何通过传递特定日期来确定星期几?
- 如何将DecimalFormat的小数分隔符从逗号更改为点/点?
- 控制jar工件的Maven最终名称
- Spring-MVC控制器中的404触发器?
- 为什么生成较长的serialVersionUID而不是简单的1L?
- JAX-RS / Jersey如何自定义错误处理?
- 在执行JpaTest时无法找到@SpringBootConfiguration
- _JAVA_OPTIONS, JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别
- 在java中转换字符到ASCII数字值