如何调试Android Rect类的空指针异常

时间:2014-09-26 13:41:48

标签: java android eclipse

我正在尝试使用eclipse将java游戏移植到Android,但是,我一直试图调试碰撞检测系统。我使用“java.awt.Rectangle”作为游戏的碰撞检测系统,它在Applet上运行良好,但当我将其转换为“android.graphics.Rect”时,应用程序在logcat中返回:

09-24 16:23:07.047:E / AndroidRuntime(15845):java.lang.NullPointerException:尝试从空对象引用上的字段'int android.graphics.Rect.left'读取

有人可以告诉我这意味着什么,如何调试,以及我的代码有什么问题? (如下所示)

编辑:在进行更改后,我发现“Rect.intersects”由于某种原因无法正常工作。两个矩形没有识别出碰撞。

如果有帮助,我正在遵循“http://www.kilobolt.com/day-7-creating-an-android-game-from-start-to-finish.html

中的教程
private int x;
private int y;
private int speedY;
protected boolean visible;
protected Rect r;

public Shoot(int startX, int startY) {
    // TODO Auto-generated constructor stub
    x = startX;
    y = startY;
    speedY=-14;
    visible= true;
    r = new Rect(0, 0, 0, 0);
}

public void update() {
    y += speedY;
    r.set(x, y, 15, 15);
    if (y < 0) {
       visible = false;
       r = null;
    }
    else if (y < 750) {
        checkCollision();
    }
}

private void checkCollision() {
    //detects collision
    if (Rect.intersects(r, GameScreen.basket.getBounds())) {
        visible = false;
        GameScreen.score += 1;
    }
}

(以下代码来自篮子类)

public Rect getBounds() {
    //Creates Rectangle boundaries for collisions
    return new Rect(240, 73, 15, 15);
}

2 个答案:

答案 0 :(得分:0)

你可能想写:

if (y< 0){
   visible = false;
   r = null;
} else if (y < 750){
    checkCollision();
}

而不是

因此,添加其他,您不会检查 null 对象。

  if (y< 0){
   visible = false;
   r = null;
  }
  if (y < 750){
    checkCollision();
  }

或者,您可以通过添加非空检查来更改 checkCollision()

private void checkCollision(){
 //detects collision
 if (r!=null && Rect.intersects(r, GameScreen.basket.getBounds())){
    visible = false;
    GameScreen.score +=1;
 }
}

答案 1 :(得分:0)

也许你想这样做,看看else

if (y< 0){
       visible = false;
       r = null;
}
else  if (y < 750){
       checkCollision();    
}