我有以下代码片段:
class Base {
public Base() {
method();
}
void method() {
System.out.println("In Base");
}
}
class Derived extends Base {
private String bar;
public Derived() {
bar="bar";
}
public void method() {
System.out.println(bar.length());
}
public static void main(String[] args) {
Base base=new Derived();
base.method();
}
}
执行代码时出现异常:
Exception in thread "main" java.lang.NullPointerException
at Derived.method(Main.java:22)
at Base.<init>(Main.java:5)
at Derived.<init>(Main.java:17)
at Derived.main(Main.java:27)
我不明白为什么会有NullPointerException和异常的stackTrace.有人可以帮助我理解吗?
您可以检查代码here.
解决方法:
new Derived()创建一个Derived对象,这意味着首先调用其超类构造函数,然后依次调用method-但您具有重写的方法,因此它是该方法的子版本.在该方法中,您调用尚未初始化的bar.length.
结论:在构造函数中调用可重写方法几乎从来不是一个好主意.