我正在尝试实现一个接口,但我得到了'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。伙计们!你是对的!但是这么多正确的答案......真的很困惑,我应该标记
答案 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
(因为这是它声明的类)。