2012-01-23 2 views
2

Я пытаюсь реализовать интерфейс, но получаю исключение «Null-pointer», но я не знаю, почему, и я не знаю, как избежать это.Почему возникает исключение «Null-pointer exception»?

класс SpaceComposite.java

import java.util.List; 
public class SpaceComposite extends SpaceComponent implements ISpaceComposite { 

    private List<ISpaceComponent> _components; 

    public SpaceComposite(String _title) { 
     super(_title); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void addComponent(ISpaceComponent component) { 
     _components.add(component);// HERE IS THE EXCEPTION RAISED 

    } 
} 

который derrives из класса SpaceComponent

public abstract class SpaceComponent implements ISpaceComponent{ 
private String _title; 

public SpaceComponent(String _title) { 
    super(); 
    setTitle(_title); 
} 

интерфейс ISpaceComposite derrives из ISpaceComponent

public interface ISpaceComposite extends ISpaceComponent{ 
    public void addComponent(ISpaceComponent component); 

} 


public interface ISpaceComponent { 
    // Title getter/setter 
     String getTitle(); 
     void setTitle(String title); 

    // Looking for a specific child 
     ISpaceComponent findChild(String name); 

    // We need to test this brave new world 
    void runTtest(); 
} 

класс Demo.class пытается создать SpaceComposite

public static ISpaceComposite createSolarSystem() { 

    ISpaceComposite solarSystem = new SpaceComposite("The Solar System"); 

    Star theSol = new Star("Sol"); 
    solarSystem.addComponent(theSol); 
} 

Эта строка генерирует исключение

public void addComponent(ISpaceComponent component) { 
    _components.add(component);// HERE IS THE EXCEPTION RAISED 

} 

но компонент «компонент» передается в функцию, и я не могу обратитесь к классу List.

Знаете ли вы, что я делаю неправильно?

P.S. Этот код был принят с C# .NET и в .NET нет ошибок.

P.P.S. Ребята! Ты прав! Но так много правильных ответов .... На самом деле путают, что я должен отметить

ответ

4

Где вы создаете _компоненты? Кажется, список никогда не создается.

Я бы изменить конструктор следующим образом:

public SpaceComposite(String _title) { 
    super(_title); 
    _components = new ArrayList<ISpaceComponent>(); 
} 
2

Вы не инициализируетесь _components поля, изменение в:

private List<ISpaceComponent> _components = new ArrayList<ISpaceComponent>(); 

Он должен быть инициализирован где-то в C# версии.

2

_компоненты не создаются. Изменение

private List<ISpaceComponent> _components; 

в

private List<ISpaceComponent> _components = new ArrayList<ISpaceComponent>(); 
1

Вам необходимо инициализировать поле _components, например,

private List<ISpaceComponent> _components = new ArrayList<ISpaceComponent>(); 
2

Вы никогда не назначаете значение для поля _components.

Инициализировать его:

private List<ISpaceComponent> _components = new ArrayList<>(); 
1

Ошибка возникает, как вы не инициализирован ваш _components в классе SpaceComposite. Таким образом, он остается нулевым и вызывает NPE при первом вызове.

Вы должны инициализировать _components в конструкторе SpaceComposite (так как это класс, в котором он объявлен).

2

Похоже, вы не инициализируете _components, поэтому, когда вы пытаетесь добавить к нему, вы получаете NullPointerException. Я предполагаю, что это было сделано в других местах в C# .NET версии

В SpaceComposite изменения

private List<ISpaceComponent> _components;

в

private List<ISpaceComponent> _components = new ArrayList<ISpaceComponent>();

Вы также можете инициализировать его в конструкторе, если вы так хотели ,