为什么这段代码会抛出NullPointerException?

时间:2015-07-09 11:36:02

标签: java

我是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)

2 个答案:

答案 0 :(得分:4)

A是在B之前构建的。在A构造函数中,您调用printLength,它在类B中被覆盖。但是,str课程中的B尚未实例化,并且会null

因此,你会得到一个空指针异常。

答案 1 :(得分:0)

见错误在

  A() { 
       printLength();           
    } 

当你执行新的B()时,因为B是A的子类,所以A()将作为B()的第一个语句被调用,这在你的情况下是默认的 在A()中,您尝试访问B类的str,但初始化阶段仍未完成,因为B()的构造函数尚未执行。 所以发生了错误。

希望我能够提供帮助。 不要尝试从构造函数开始执行,因为它意味着初始化属性。

感谢。