java.lang.IncompatibleClassChangeError 常见错误

最近开发中遇到类冲突报错 java.lang.IncompatibleClassChangeError,遂了解并复现一些case

java.lang.IncompatibleClassChangeError 解释

错误解释

package java.lang;

/**
 * Thrown when an incompatible class change has occurred to some class
 * definition. The definition of some class, on which the currently
 * executing method depends, has since changed.
 *
 * @author  unascribed
 * @since   JDK1.0
 */
public
class IncompatibleClassChangeError extends LinkageError {
    
    
    private static final long serialVersionUID = -4914975503642802119L;

即在执行过程中,有些类的定义发生了改变。即某个.class文件不是期望的那样,它被改变了。

对该类的扩展解释:http://jszx-jxpt.cuit.edu.cn/javaapi/java/lang/IncompatibleClassChangeError.html,平时看到的NoSuchFieldError, NoSuchMethodError等都属于这种错误

IncompatibleClassChangeError 错误复现

public class Base {
    
    
    public int val = 1;
    public void run(){
    
    
        System.out.println("base run");
    }
}

public class Fa extends Base {
    
    

    @Override
    public void run() {
    
    
        System.out.println("fa go");
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Base base = new Fa();
        System.out.println(base.val);
        base.run();
    }
}

在这里插入图片描述

修改Base.java文件(如下,将val变成static),重新生成.class

 public static int val = 1;

然后再次执行就能出现java.lang.IncompatibleClassChangeError报错
在这里插入图片描述

java.lang.IllegalAccessError

再比如: 基类成员从过年public变成private, 父类无法访问报错java.lang.IllegalAccessError
在这里插入图片描述

java.lang.NoSuchMethodError

基类某个方法没有了(比如jar升级),然后编译,运行时执行报错java.lang.NoSuchMethodError
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/124537133