为什么引发'空指针异常'?

时间:2012-01-23 14:40:39

标签: java

我正在尝试实现一个接口,但我得到了'Null-pointer'异常,但我不知道为什么,我不知道如何避免它。

类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

    }
}

来自SpaceComponent类

public abstract class SpaceComponent implements ISpaceComponent{
private String _title;

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

接口ISpaceComposite来自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

}

但是组件'component'被传递给函数,我无法查看List类。

你知道吗,我做错了什么?

P.S。这段代码是从C#.NET中采用的,在.NET中没有错误。

P.P.S。伙计们!你是对的!但是这么多正确的答案......真的很困惑,我应该标记

7 个答案:

答案 0 :(得分:4)

您在哪里实例化_components?似乎永远不会创建列表。

我会修改构造函数,如下所示:

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

答案 1 :(得分:2)

您尚未初始化_components字段,请更改为:

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

它必须已在C#版本的某处初始化。

答案 2 :(得分:2)

_components永远不会被实例化。变化

private List<ISpaceComponent> _components;

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

答案 3 :(得分:2)

您永远不会为_components字段指定值。

用以下内容初始化:

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

答案 4 :(得分:2)

您似乎没有初始化_components,所以当您尝试添加时,您会得到NullPointerException。我认为这是在C#.NET版本

的其他地方完成的

在SpaceComposite中更改

private List<ISpaceComponent> _components;

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

如果您愿意,也可以在构造函数中初始化它。

答案 5 :(得分:1)

您需要初始化字段_components,例如

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

答案 6 :(得分:1)

由于您尚未在SpaceComposite类中初始化_components,因此会发生错误。因此,它保持为null并在第一次调用时导致NPE。

您应该在SpaceComposite构造函数中初始化_components(因为这是它声明的类)。