我是Java新手。我在一本书中找到了这个例子。我希望它能打印出来" ab"或" abc",但它会引发异常。有人能解释为什么会这样吗?提前谢谢。
public class Test {
class A {
String str = "ab";
A() {
printLength();
}
void printLength() {
System.out.println(str.length());
}
}
class B extends A {
String str = "abc";
void printLength() {
System.out.println(str.length());
}
}
public static void main(String[] args) {
new Test().new B();
}
}
这是例外
Exception in thread "main" java.lang.NullPointerException
at c.Test$B.printLength(Test.java:25)
at c.Test$A.<init>(Test.java:13)
at c.Test$B.<init>(Test.java:21)
at c.Test.main(Test.java:30)
答案 0 :(得分:4)
A
是在B
之前构建的。在A
构造函数中,您调用printLength
,它在类B
中被覆盖。但是,str
课程中的B
尚未实例化,并且会null
。
因此,你会得到一个空指针异常。
答案 1 :(得分:0)
见错误在
A() {
printLength();
}
当你执行新的B()时,因为B是A的子类,所以A()将作为B()的第一个语句被调用,这在你的情况下是默认的 在A()中,您尝试访问B类的str,但初始化阶段仍未完成,因为B()的构造函数尚未执行。 所以发生了错误。
希望我能够提供帮助。 不要尝试从构造函数开始执行,因为它意味着初始化属性。
感谢。