java.lang.NoSuchMethodError

这个错误其实很明显,就是没有这个方法,一般情况可能是更新代码少了文件。但是今天遇到一个奇怪的事情,修改的文件都已经更新过了,但是依旧出现了这个问题,究竟为何?

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.javaB.java都重新编译才可以运行。

还有有时候这里会出现空指针,就是Integernull,拆箱为int时导致的。

这里还有个值得注意的地方就是这个错误级别是Error,所以exception并不能捕获。