Java-参考已实现的类
我有一个小问题:我为我的游戏开发了一个“ExampleQuest”类,它扩展了抽象类Quest。我这样做是为了创建单独的任务类。现在我的ExampleQuest类应该计算实体的死亡,所以我实现了EntityListener。现在我必须在我的Playstate类中注册它,以使一切正常工作,但这是我的实际问题:方法Playstate.addEntityListener(this)给了我一个空指针异常。我发现这个错误是由任何扩展类引起的。如果ExampleQuest不能扩展Quest,那么一切都会正常工作。我的任务类没有错误,因为如果我用其他东西扩展ExampleQuest,我也会得到一个nullpointer异常 --->因此,我的解释是,来自Playstate.addEntityListener(this)的this在本例中指的是扩展类Quest,而不是EntityListener。我怎样才能解决我的问题Java-参考已实现的类,java,reference,implementation,Java,Reference,Implementation,我有一个小问题:我为我的游戏开发了一个“ExampleQuest”类,它扩展了抽象类Quest。我这样做是为了创建单独的任务类。现在我的ExampleQuest类应该计算实体的死亡,所以我实现了EntityListener。现在我必须在我的Playstate类中注册它,以使一切正常工作,但这是我的实际问题:方法Playstate.addEntityListener(this)给了我一个空指针异常。我发现这个错误是由任何扩展类引起的。如果ExampleQuest不能扩展Quest,那么一切都会正常
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>();
}