静态方法导致的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方法还是使用的静态调用,和实例无关,静态方法时和类绑定的。

原文地址:https://www.cnblogs.com/ZiYangZhou/p/11588236.html

时间: 2024-12-21 08:27:44

静态方法导致的java.lang.NoSuchMethodError错误的相关文章

如何排查java.lang.NoSuchMethodError错误

今天碰到一个java.lang.NoSuchMethodException的异常.基本解决思路是: 1.检查类所在jar包的版本是否正确. 2.检查是否有jar包冲突,比如加载了多个版本的xxx.jar. 如果是maven工程,可以通过mvn dependency:tree来显示工程的依赖树. 3.如果还无法定位,可以通过以下方法来找到工程实际加载的类属于哪个jar包. 1 Class<?> clazz = Class.forName("com.xxx.xxx.XXX");

Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError

在测试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本4.1.1. 其实原因就是isDestroyed()这个方法是在4.2引入的,所以在4.1.1上调用此方法会报错. 需要做一下版本的判断了,Build.VERSION.SDK_INT < 17. 那么问题来了,如何判断某个函数引入的版本呢?从android开发者网站就可以发现, 其实想在源码里面看到,可是源码里面没有说明. htt

java.lang.NoSuchMethodError,jenkins插件升级导致问题报错

Started by user test java.lang.NoSuchMethodError: org.eclipse.jgit.lib.Repository.getRef(Ljava/lang/String;)Lorg/eclipse/jgit/lib/Ref; at jenkins.plugins.git.GitSCMFileSystem$1.invoke(GitSCMFileSystem.java:117) at jenkins.plugins.git.GitSCMFileSystem

Hibernate常见错误:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibe

hibernate4 与 spring3有点冲突 http://blog.csdn.net/gyflyx/article/details/7632645 整合NoSuchMethodError错误 and 升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决 2012-02-20 10:33:28|  分类: 编程_SSH |字号 订阅 我使用的是hibernate4和spring3,然后报的错误是 java.lang.NoSuchMethodError: or

new SparkContext()发生错误java.lang.NoSuchMethodError: scala.Predef

参考:https://blog.csdn.net/weixin_40137479/article/details/80320324 new SparkContext(conf)发生错误: Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps; at org.apache

java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z解决方法

运行JavaEE项目时出现如下错误: java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z at com.opensymphony.xwork2.ognl.OgnlUtil.isEvalExpression(OgnlUtil.java:245) at com.opensymphony.xwork2.ognl.OgnlUtil.checkEnableEvalExpression(OgnlUtil.

使用selenium遇到java.lang.NoSuchMethodError: org.apache.xpath.XPathContext,排查

处试selenium webdriver,运行小程序,抛如下错误: java.lang.NoSuchMethodError: org.apache.xpath.XPathContext.<init>(Z)V at org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:115) at org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpression

Junit测试出现异常:Exception in thread &quot;main&quot; java.lang.NoSuchMethodError: org.junit.platform.commons.util.

在进行单元测试时,测试出现异常 Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader()Ljava/lang/ClassLoader; 错误就在pom.xml的依赖中,仔细查看控制台输出你会发现IntelliJ IDEA正在尝试使用JUnit5运行我的测试用例. at com.intelli

java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView

错误:Exception in thread "main" java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView; 原因:代码中调用了ConcurrentHashMap<K, V>的keySet()方法 jdk1.6/1.7中: public Set<K> keyS