静态方法导致的java.lang.NoSuchMethodError错误
静态方法导致的java.lang.NoSuchMethodError错误
今天修改bug时,将变异出来的class文件直接发给测试进行测试,结果测试进行测试的时候抛出了一个java.lang.NoSuchMethodError
错误,这个错误表明运行程序的时候,对象调用的方法不存在。我本地环境可以正常编译程序和运行,为什么他们的环境却不行呢,排查了日志,定位错误,将相关的两个class文件从测试环境拉了出来,反编译之,发行是因为静态方法的导致的问题。
为了方便描述和避免泄漏我这里定义了两个类A和B。
A类
public class A {
public void f2() {
System.out.println("invoke f2");
new B().f1();
}
}
B类
public class B {
public static void f1() {
System.out.println("invoke f1");
}
}
在A类的f2方法中调用B类的f1方法,这样本来是没有什么问题的,但是问题却出现在了这个静态方法上面。最开始B类的f1方法不是静态的,所以在A类中去调用f1方法需要先将B实例化,这样的代码编译后放到了测试环境,后来我在改A类的时候,去svn拉新的代码,这个B类的f1方法被他人改为静态的了,我自己只修改了A的部分代码,然后编译之,将A编译的class文件放到测试环境去测试了,这样就报了这样的错误。
Exception in thread "main" java.lang.NoSuchMethodError: test.B.f1()V
at test.A.f2(A.java:6)
at test.App.main(App.java:5)
最开始想相关的方法都存在,参数也不存在问题,怎么会出现这样的问题呢,直到反编译出结果才明白。
A类反编译结果
public class A { public void f2() { System.out.println("invoke f2");
new B();B.f1();
}
}
虽然在A类的f2方法中调用B的f2方法时对B进行了实例化,但是调用B的f1方法还是使用的静态调用,和实例无关,静态方法时和类绑定的。