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

когда я создаю и экземпляр Child как 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) 

Я знаю, что исключение occu rs из-за 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

actucally Я знаю, но мне интересно, когда создается дочерний конструктор. – ismail

+0

Конструктор детей предоставляется системой в вашем случае. И самый первый оператор в системном конструкторе 'Child', называемом' super(); ' –

2

У вас есть неявный конструктор Child(). Он вызывает Parent(), Parent() вызывает parentFunc(), который вызывается в подклассе. В этот момент ваш список по-прежнему равен нулю, и вы получаете NullPointerException (NPE).

Смотрите также:

Java Constructor and Field Initialization Order

1

Это, как правило, плохая идея назвать абстрактные методы из конструктора, как вы подверглись риску такого рода проблемы.

Смежные вопросы