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

  • 相关阅读:
    上传图片2(接上一篇)
    上传图片2
    上传图片
    SQL Server基础之存储过程
    C#导入Excel、Excel导入、导入.xls 、导入.xlsx、Excel2003版本、Excel2007版本
    C#使用 System.Net.Mail发送邮件功能
    C#发送邮件三种方法,Localhost,SMTP,SSL-SMTP
    angular模板
    从“繁”到“简”进行数组去重
    CSS强制英文、中文换行与不换行
  • 原文地址:https://www.cnblogs.com/ZiYangZhou/p/11588236.html
Copyright © 2011-2022 走看看