2013-12-20 74 views
5

我得到NullPointerException下面的代碼。擴展父類時發生Java 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"); 
    } 
} 
當我創建

Childnew 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. 當創建功能,並呼籲其稱爲構造
+0

父母是先構建的,然後是孩子。該函數被調用時,該列表並未創建,因此是NPE。 – duffymo

回答

4

當創建列表變量?

一旦Child類的構造函數運行,它將被創建。

當構造函數被調用?

當你試圖讓使用new Child()對象,構造函數被調用Child,並在內部調用super()它調用父類的構造Parent()。注意,在Child()構造非常第一條語句是super()

系統會爲您生成這樣的無arguement構造:

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

當創建功能,並呼籲其稱爲構造

清除了一點什麼是你想問。

Order Of Execution: 

父Constructor->兒童構造函數 - >列表

2

當父類的構造調用調用的函數,你列出未初始化和defailu值的對象null有,

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

actuhally我知道,但我不知道什麼時候創建子構造函數 – ismail

+0

子項構造函數由System提供。系統提供的'Child'構造函數中的第一個語句叫做'super();' –

2

你有一個隱式的Child()構造函數。它調用Parent(),Parent()調用在子類中調用的parentFunc()。那時你的列表仍然是空的,你會得到NullPointerException(NPE)。

參見:

Java Constructor and Field Initialization Order

1

它通常是一個壞主意來調用構造函數抽象方法,因爲你暴露自己這樣那樣的問題。