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/

知识的树形拓扑结构

知识与知识之间是存在依赖关系的,这种依赖关系可以用树形拓扑结构来描述。计算机最原始最基本的树形拓扑图如下所示:

计算机的所有知识都是建立在物理学(尤其是电学)和数学的基础之上的。物理学支撑了计算机的硬件方面,而数学则支持了计算机的软件方面。

再比如计算机中的HTTP的知识拓扑结构:

技术攻坚的“点线原则”

点:选准一个点,发力,重点突破。可以围绕这个点在相关的其他地方做适当的尝试,除非形成突破,否则就不要再继续花费过多的时间了,需要尽快回到点上来或继续在别的地方尝试。这个过程必须保证只有一个重点。我们经常犯的错误就是在这个地方挖一下,又在别的地方动几下锄头。这就有点想挖井的策略,既不能太死较劲,万一这个地方真的一点谁也没有,你就算挖一辈子也挖不出井来;但是也不能一点劲也不用,否则就算地下有水,你挖的太浅了,也不可能出水来的。

线:在攻坚的过程中不能中途停止,要一鼓作气,形成突破。保持连续性,以避免二次攻坚时在精力和状态恢复过程的时间浪费。