静态方法导致的java.lang.NoSuchMethodError错误
Posted Oh,L.E.D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态方法导致的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方法还是使用的静态调用,和实例无关,静态方法时和类绑定的。
以上是关于静态方法导致的java.lang.NoSuchMethodError错误的主要内容,如果未能解决你的问题,请参考以下文章
Android开发 关于静态static类与static方法持有Context是否导致内存泄露的疑问
在静态方法中使用匿名 Lamba 订阅事件会导致内存泄漏吗?