Java-参考已实现的类

Java-参考已实现的类,java,reference,implementation,Java,Reference,Implementation,我有一个小问题:我为我的游戏开发了一个“ExampleQuest”类,它扩展了抽象类Quest。我这样做是为了创建单独的任务类。现在我的ExampleQuest类应该计算实体的死亡,所以我实现了EntityListener。现在我必须在我的Playstate类中注册它,以使一切正常工作,但这是我的实际问题:方法Playstate.addEntityListener(this)给了我一个空指针异常。我发现这个错误是由任何扩展类引起的。如果ExampleQuest不能扩展Quest,那么一切都会正常

我有一个小问题:我为我的游戏开发了一个“ExampleQuest”类,它扩展了抽象类Quest。我这样做是为了创建单独的任务类。现在我的ExampleQuest类应该计算实体的死亡,所以我实现了EntityListener。现在我必须在我的Playstate类中注册它,以使一切正常工作,但这是我的实际问题:方法Playstate.addEntityListener(this)给了我一个空指针异常。我发现这个错误是由任何扩展类引起的。如果ExampleQuest不能扩展Quest,那么一切都会正常工作。我的任务类没有错误,因为如果我用其他东西扩展ExampleQuest,我也会得到一个nullpointer异常

--->因此,我的解释是,来自Playstate.addEntityListener(this)的this在本例中指的是扩展类Quest,而不是EntityListener。我怎样才能解决我的问题

public class ExampleQuest extends Quest implements EntityListener {

    public ExampleQuest() {
        super();
        Playstate.addEntityListener(this); //gives me nullointer exception 
    }

    //implemented method
    public void entityDeathEvent(EntityEvent e) {

    }
}
这是我的Playstate课程的一部分:

public class Playstate {

    public static Set<EntityListener> entityListener;

    public Playstate() {
        entityListener = new HashSet<EntityListener>();
    }

    public static void addEntityListener(EntityListener listener) {
        entityListener.add(listener);
    }
}

它之所以能工作,是因为EventHandler只实现类

您的字段entityListener是空的,因为它是静态的,并且您只在创建
Playstate
的对象时初始化字段

可能,
entityListener
addEntityListener
都不应该是静态的。让他们成为实例成员

public class Playstate {

    public Set<EntityListener> entityListener;

    public Playstate() {
        entityListener = new HashSet<EntityListener>();
    }

    public void addEntityListener(EntityListener listener) {
        entityListener.add(listener);
    }
}
公共类播放状态{
公共集实体侦听器;
公共游戏状态(){
entityListener=newHashSet();
}
公共void addEntityListener(EntityListener listener){
添加(侦听器);
}
}
关于您的编辑:我们只能假设当您的
EventHandler
代码运行时,它可以工作,因为您已经在代码的其他地方创建了
Playstate
对象

Playstate
使用静态事件监听器意味着所有这些对象都将共享事件监听器,这是一个>糟糕的
公共Playstate(){
entityListener=newHashSet();
}
公共静态void addEntityListener(EntityListener listener){
添加(侦听器);
}
构造PlayState构造函数时,entityListener静态变量被赋值。这是一个严重的设计问题:要么监听器是静态的,因此不与PlayState的任何实例关联,因此不应该在每次创建实例时分配,要么它与给定实例关联,并且不应该是静态的

侦听器和
addEntityListener()
方法不应该是静态的。相反,任务应该有对PlayState类实例的引用


此外,由于它是侦听器的集合,因此变量应命名为
entityListeners
,而不是
entityListener

,获得NPE的原因是
entityListener
尚未初始化。
entityListener
尚未初始化的原因是,您的代码需要先创建
Playstate
的实例,然后才能开始使用
addEntityListener
方法,但在创建
Playstate
的实例之前调用
addEntityListener

这是错误的:不应该在实例构造函数中初始化静态变量。您需要在声明中这样做

public static Set<EntityListener> entityListener = new HashSet<EntityListener>();

使
entityListener
成为一个实例变量也可以,但是您需要提供一种从
ExampleQuest
的构造函数上下文中获取
Playstate
实例的方法。

显示
Qwest
类。至少是字段和构造函数。你能发布stacktraceThere吗?还没有创建任何
Playstate
实例,因此静态字段还没有从称为Playstate构造函数的not-[尚未]中分配。静态的使用是可疑的,但可以通过在声明中赋值(例如,
公共静态集entityListener=new HashSet();
)或静态初始化块(然后从Playstate构造函数中删除赋值)来“修复”。如果我要这样做:public class EventHandler ImElements entityListener{public EventHandler(){Playstate.addEntityListener(this);}}一切都很好,因为这个类只是在实现而不是扩展谢谢你的帮助:))uff这让我很困惑,我自己在学习java,直到现在我才知道静态{}^^
public Playstate() {
    entityListener = new HashSet<EntityListener>();
}

public static void addEntityListener(EntityListener listener) {
    entityListener.add(listener);
}
public static Set<EntityListener> entityListener = new HashSet<EntityListener>();
public static Set<EntityListener> entityListener;

static {
    entityListener = new HashSet<EntityListener>();
}