zoukankan      html  css  js  c++  java
  • 静态方法导致的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方法还是使用的静态调用,和实例无关,静态方法时和类绑定的。

  • 相关阅读:
    AD中各层的说明
    Altium designer的PCB设计规则
    python 的基础 学习 第三天 编码的初始
    python 的基础 学习 第三
    python的基础初始第二天
    python 的基础 学习 第一天
    Liunx ls命令
    Liunx cd命令
    CentOS 7系统关闭yum自动下载更新
    【转】XenServer体系架构解析
  • 原文地址:https://www.cnblogs.com/ZiYangZhou/p/11588236.html
Copyright © 2011-2022 走看看