我尝试删除对象时获取空指针异常

时间:2014-12-20 00:04:43

标签: java android game-engine

我正在开发适用于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);
}

当我尝试添加更多对象时,似乎也会出现此错误。

2 个答案:

答案 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被抛出的位置。您可以通过两种方式执行此操作:

  1. 查看stackstrace
  2. 在IDE中使用调试器,并一次获取一行代码,以查看它何时抛出异常
  3. 你说过你这样做是为了在使用它之后销毁它。首先,确保您将正确的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 可能出现在该方法中:

  • 如果objectnull,则synchronized(object)会抛出NPE

  • 如果object列表包含任何null个引用,那么您将获得tempObject.update(...)

  • 的NPE
新堆栈跟踪的

更新

die(在您向我们展示的版本中)playState null {{1}}是{{1}}的唯一方法。


您还没有提供足够的信息来确定为什么存在意外的空值。

  

有什么想法吗?

我建议你按照我在这里描述的方法: