IncompatibleClassChangeError

java.lang.IncompatibleClassChangeError:这种错误主要用于表示“不兼容性的类的变化错误”。这种问题往往发生在比较大的java项目中,由于jar包的版本变化,导致两种相互依赖的jar包不再兼容。网上有不少人说是jar包重复导致,但是这种说法不是很准确。通俗来讲,这种错误就是一个类的变化差异太大,现在正在执行的代码(正在使用这个类的代码)已经无法正常运行。最常见的情况是父类或接口的变化,导致子类出现错误(导致子类必须重构,即重新编译)。这种错误一般是在父类或接口与子类分开编译的前提下才会出现。往往是父类或接口已经改动而且重新编译过了,但是没有重新编译子类,导致子类(.class文件)与重新编译之后的父类或者接口(.class文件)不匹配引起的。

下面列举一些常见的具体情境:

(1)java.lang.IncompatibleClassChangeError: Expected non-static field ChildClass.name

父类中的某个成员变量改变为static类型的类变量,而子类中却还是以对象变量来访问这个域。比如:

public class BaseClass{

public String name=”BaseClass”;

}

public class ChildClass extends BaseClass{

public static void main(String[] agrs){

BaseClass obj = new ChildClass();

System.out.println(this.name);

}

}

BaseClass修改之后重编译:

public class BaseClass{

public static String name=”BaseClass”;

}

(2)java.lang.IncompatibleClassChangeError: Expected static field BaseClass.name

父类中的类变量改变为对象变量

public class BaseClass{
public static String name=”BaseClass”;
}

public class ChildClass extends BaseClass{
public static void main(String[] agrs){
System.out.println(BaseClass.name);
}
}

BaseClass修改之后重编译:

public class BaseClass{
public String name=”BaseClass”;
}

(3)java.lang.IncompatibleClassChangeError: Implementing class

字面意思就是“实现了类”,父接口的类型变成类,导致子类错误:

public interface BaseInterface{

}

public class ChildClass implements BaseInterface{

public static void main(String[] agrs){

}

}

BaseInterface修改之后重编译:

public class BaseInterface{

}

(4)java.lang.IncompatibleClassChangeError: class ChildClass has interface BaseClass as super class

父类改变成接口导致:

public class BaseClass{
}

public class ChildClass extends BaseClass{

public static void main(String[] agrs){
System.out.println(“Hello World”);
}
}

BaseClass修改之后重编译:

public interface BaseClass{
}

 

参考文章:

[1]http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/