扩展父类时出现Java NullPointerException

时间:2013-12-20 20:27:48

标签: java inheritance

我的代码低于NullPointerException

Parent.java

public abstract class Parent {

    public Parent(){
        parentFunc();
    }

    public abstract void parentFunc();
}

Child.java

public class Child extends Parent {
    ArrayList<String> list = new ArrayList<String>();

    @Override
    public void parentFunc() {
        list.add("First Item");
    }
}

当我创建Child的{​​{1}}实例时new Child()我正在NullPointerException 这是我的控制台输出

Exception in thread "main" java.lang.NullPointerException
    at Child.parentFunc(Child.java:8)
    at Parent.<init>(Parent.java:5)
    at Child.<init>(Child.java:3)
    at Main.main(Main.java:8)

我知道由于在父构造函数中调用的Child.parentFunc()而发生异常,但我真的很困惑。所以我想知道发生了什么

创作的顺序是什么;

  1. 创建列表变量时
  2. 调用构造函数时
  3. 创建并调用在构造函数中调用的函数时

4 个答案:

答案 0 :(得分:4)

  

创建列表变量时?

一旦Child类的构造函数运行,它就会被创建。

  

何时调用构造函数?

当您尝试使用new Child()创建对象时,将为Child调用构造函数,并在内部调用调用超类构造函数super()的{​​{1}}。 Parent()构造函数中的第一个语句是Child()

系统会为你生成no-arguement构造函数:

super()
  

创建并调用在构造函数中调用的函数时

清楚一下你想问什么。

public child()
{
 super();// calls Parent() constructor.
 //your constructor code after Parent constructor runs
}

父构造函数 - &gt;子构造函数 - &gt;列表

答案 1 :(得分:2)

当父构造函数调用了被调用的函数时,你列出的是未初始化的,并且对象null的defailu值是否存在,

 @Override
    public void parentFunc() {
        list.add("First Item");   // list not yet initialized
    }

答案 2 :(得分:2)

你有一个隐式的Child()构造函数。它调用Parent(),Parent()调用在子类中调用的parentFunc()。那时你的列表仍然是null,你得到NullPointerException(NPE)。

另见:

Java Constructor and Field Initialization Order

答案 3 :(得分:1)

从构造函数中调用抽象方法通常是一个坏主意,因为你暴露在这种问题中。