我正在开发适用于Android的2D平台游戏,而我在删除对象时遇到了问题。
当对象被击中时,我使用此代码将其删除:
public void removeObject(GameObject object) {
this.object.remove(object);
}
这是主要的更新方法(更新所有对象):
public void update() {
synchronized (object) {
for (int i = 0; i < object.size(); i++) {
tempObject = object.get(i);
tempObject.update(object);
}
}
}
由于某些原因,当对象被点击时,应用程序崩溃了NullPointerException
。
这是我得到的错误:
java.lang.NullPointerException
at com.shuster.killtheex.objects.Ex.die
at com.shuster.killtheex.objects.Ex.update(Ex.java:100)
at com.shuster.killtheex.state.PlayState.update(PlayState.java:48)
at com.shuster.killtheex.framework.GameView.update(GameView.java:73)
at com.shuster.killtheex.framework.GameView.run(GameView.java:119)
at java.lang.Thread.run(Thread.java:841)
这是die
方法:
private void die() {
playState.removeObject(this);
}
当我尝试添加更多对象时,似乎也会出现此错误。
答案 0 :(得分:0)
如果在某些情况下object.get(i)有可能返回null,那么你应该在tempObject上检查null。
public void update() {
synchronized (object) {
for (int i = 0; i < object.size(); i++) {
tempObject = object.get(i);
if(tempObject != null)
tempObject.update(object);
}
}
}
然而,正如另一个答案所暗示的,你首先需要找出NPE被抛出的位置。您可以通过两种方式执行此操作:
你说过你这样做是为了在使用它之后销毁它。首先,确保您将正确的objekt传递给方法。再一次;如果有可能该对象可能已被另一个进程销毁,您也可以对该对象进行空检查:
public void update() {
if(object != null){
synchronized (object) {
for (int i = 0; i < object.size(); i++) {
tempObject = object.get(i);
if(tempObject != null)
tempObject.update(object);
}
}
}
但是 - 请了解如何使用IDE的调试工具,并查看正在抛出的异常,并尝试了解原因。
答案 1 :(得分:0)
由于某些原因,当对象被击中时,应用程序会因空指针异常而崩溃。
之所以会发生这种情况,是因为您有一个空引用(或引用),并且MPE发生的位置并不期望这样。具体而言,由于以下几个原因,NPE 可能出现在该方法中:
如果object
为null
,则synchronized(object)
会抛出NPE
如果object
列表包含任何null
个引用,那么您将获得tempObject.update(...)
更新:
die
(在您向我们展示的版本中)playState
null
{{1}}是{{1}}的唯一方法。
您还没有提供足够的信息来确定为什么存在意外的空值。
有什么想法吗?
我建议你按照我在这里描述的方法: