我的代码低于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()而发生异常,但我真的很困惑。所以我想知道发生了什么
创作的顺序是什么;
答案 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)。
另见:
答案 3 :(得分:1)
从构造函数中调用抽象方法通常是一个坏主意,因为你暴露在这种问题中。