我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?
当前回答
我也遇到过类似的问题。
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文件来解决这个问题。
其他回答
我也遇到过这种错误。
我的问题是我改变了一个方法的签名,就像这样
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后,它将找不到这样一个方法,它看起来好像它被删除了而没有被更改,因此出现了命名错误。
希望这能有所帮助。
为什么没有人提到依赖冲突?这个常见问题可能与包含不同版本的依赖jar有关。 详细解释及解决方法:https://dzone.com/articles/solving-dependency-conflicts-in-maven
简短的回答;
添加这个maven依赖项;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<rules>
<dependencyConvergence />
</rules>
</configuration>
</plugin>
然后运行这个命令;
mvn enforcer:enforce
也许这就是你面临问题的原因。
大多数时候java.lang.NoSuchMethodError会被编译器捕获,但有时它会在运行时发生。如果此错误在运行时发生,那么惟一的原因可能是类结构的更改使其不兼容。
最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror
对我来说,它发生了,因为我改变了函数中的参数类型,从对象a,到字符串a。我可以用清洁和重新构建来解决它
以上答案解释得很好。再补充一点 如果你正在使用eclipse,使用ctrl+shift+T并输入类的包结构(例如:gateway.smpp.PDUEventListener),你会找到它存在的所有jar /项目。从类路径中删除不必要的jar或将其添加到类路径中。现在它会选择正确的。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap