我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?
当前回答
在我的情况下,我有一个多模块项目和场景像com.xyz.TestClass是在模块a,以及在模块B和模块a依赖于模块B。因此,创建一个程序集jar,我认为只有一个版本的类被保留,如果没有调用的方法,然后我得到NoSuchMethodError运行时异常,但编译是好的。
相关网址:https://reflectoring.io/nosuchmethod/
其他回答
大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。
最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror
注意,在反射的情况下,您将得到NoSuchMethodException,而对于非反射代码,您将得到NoSuchMethodError。当我面对其中一种和另一种时,我倾向于去看非常不同的地方。
我也遇到过这种错误。
我的问题是我改变了一个方法的签名,就像这样
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后,它将找不到这样一个方法,它看起来好像它被删除了而没有被更改,因此出现了命名错误。
希望这能有所帮助。
对我来说,它发生了,因为我改变了函数中的参数类型,从对象a,到字符串a。我可以用清洁和重新构建来解决它
我刚刚通过重新启动Eclipse并运行应用程序解决了这个错误。 我的情况可能是因为我在没有关闭项目或Eclipse的情况下替换了源文件。 这导致了我使用的不同版本的类。
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?