在我们的一个类上使用简单的getter方法得到NoSuchMethodError。奇怪的是我们可以调试代码并在调试器中看到错误(通过跳过相关的行),但是我们也可以使用IDE(IntelliJ IDEA)来查看方法确实存在。
通过IDE表达式求值程序执行xxxx.getYYY()
评估。转到xxxx.getClass().getMethods()
,我们可以在列表中看到getYYY()
方法。我们已经尝试清理所有构建的文件,IDE输出目录,IDE缓存,重新启动等,似乎没有任何帮助。
我理解如果我们针对某些内容进行编译但是在运行时找到了不同的Jar /类,则会发生NoSuchMethodError。但这并没有向我解释为什么在运行时调试到有问题的行时,我们可以看到方法存在,但是跳过该行会抛出异常。
尝试在另一台机器上进行复制但不会重现。
有没有人对这里可能发生的事情有任何见解?
答案 0 :(得分:2)
很可能您没有在IntelliJ中运行与编辑内容相同的代码版本。我经常遇到这个问题,很多maven项目一次打开,不同版本依赖于我正在编辑的内容。 IntelliJ可能会混淆(或者我对我实际运行的版本感到困惑)
答案 1 :(得分:0)
NoSuchMethodError - 这主要发生在运行时。我遇到了这个错误,原因是我的类路径中的asm和cglib库的版本不兼容。
asm和cglib库被许多框架使用,如hibernate,spring,hadoop,用于运行时字节代码操作。
Classloader始终引用类路径上jar的第一个版本。