2013-12-20 19 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"); 
    } 
} 

私が作成し、私はここでNullPointerException を取得していますChildnew Child()ようのインスタンスは、私のコンソール出力である

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) 

私はその例外occuを知っています親コンストラクタで呼び出されたChild.parentFunc()が原因ですが、本当に混乱しました。だから私は何が起こっているのだろうか

作成の順序は何ですか?

  1. リスト変数が作成されたコンストラクタは、コンストラクタで呼び出さ
  2. 機能を作成し、呼ばれ
  3. 親のコンストラクタは、関数が呼び出されて呼び出さ
+0

親が最初に作成され、次に子が作成されます。関数が呼び出されたときにリストが作成されなかったため、NPEが呼び出されました。 – duffymo

答えて

4

これは、Childクラスが実行されると一度作成されます。

コンストラクタが呼び出されるときは?

あなたがnew Child()を使用してオブジェクトを作成しようとすると、コンストラクタがChildを求め、それが内部Child()コンストラクタでは非常に最初の文がsuper()であることをスーパークラスのコンストラクタParent()。注を呼び出すsuper()を呼び出しています。

システムは、このようにあなたのための無arguementコンストラクタを生成します:関数が作成され、呼び出されると、あなたが何をしようとしているコンストラクタに

と呼ばれ

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

ビットをクリアして聞く、質問する 。

Order Of Execution: 

親Constructor->子コンストラクタ - >リスト

2

、あなたが初期化されていないリストと呼ばれ

  • オブジェクトnullにdefailu値があります。

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

    私は知っていますが、子コンストラクタがいつ作成されるのだろうか – ismail

    +0

    あなたのケースでは、子コンストラクタはSystemによって提供されています。そして、 'super();'というシステム提供の '子'コンストラクタの最初のステートメントは、 –

    2

    暗黙のChild()コンストラクタがあります。 Parent()を呼び出し、Parent()はサブクラスで呼び出されるparentFunc()を呼び出します。その時点であなたのリストはまだヌルで、あなたはNullPointerException(NPE)を取得します。

    も参照してください:リスト変数が作成され

    Java Constructor and Field Initialization Order

    1

    それは通常、あなたがこの種の問題に自分自身を暴露として、コンストラクタから抽象メソッドを呼び出すことは悪い考えです。

    関連する問題