java.lang.NoSuchMethodError
0
这个错误其实很明显,就是没有这个方法,一般情况可能是更新代码少了文件。但是今天遇到一个奇怪的事情,修改的文件都已经更新过了,但是依旧出现了这个问题,究竟为何?
java.lang.NoSuchMethodError: xxxx.xxxx.ClassName.select(ILjava/lang/String;)Lxxxx/xxxx/xxxxE
想了很久,我把全部代码放了一遍后发现没有问题了,想起了看过的一本书说过更新代码的一个陷阱就是有些方法修改后,引用方法的地方也会在编译的时候发生变化。如下代码:
A.java
public class A {
public static void main(String[] args) {
int a = 0;
B b = new B();
b.say(a);
}
}
B.java
public class B {
public void say(int input) {
System.out.println("输入值:" + input);
}
}
编译运行:
E:\cert>javac A.java
E:\cert>java A
输入值:0
然后修改B.java
public class B {
public void say(Integer input) {
System.out.println("输入值:" + input);
}
}
只编译B.java
,然后运行:
E:\cert>javac B.java
E:\cert>java A
Exception in thread "main" java.lang.NoSuchMethodError: B.say(I)V
at A.main(A.java:5)
好了主要就是say
方法的参数由int
变成了Integer
所以就会导致这个错误,这里应该是编译的时候会对int
进行自动装箱操作,所以很难发现这个问题。
这里需要对A.java
和B.java
都重新编译才可以运行。
还有有时候这里会出现空指针,就是Integer
是null
,拆箱为int
时导致的。
这里还有个值得注意的地方就是这个错误级别是Error
,所以exception
并不能捕获。