0

我正在尝试为 android 制作俄罗斯方块游戏,以帮助学习 android 的游戏编程。按下按钮时,我的 goLeft/Rights 向右中断,向左移动的代码位于字段 int 数组和列表部分数组分开的类中。字段数组由引用变量 (TetrisWorld tetrisworld;) 访问。虽然零件列表数组是公共的,但可以通过 goLeft() 代码中的变量(零件)代码访问。它在以下位置中断: if(tetrisworld.fields[x][part.y] != 0) 左侧代码:

public void goLeft() {
    int x = 0;
    for(int i = 0; i < 4; i++) {
        TetrisParts part = parts.get(i);
        x = part.x - 1;
        if(tetrisworld.fields[x][part.y] != 0) {
            noleft = true;
            break;
        }
    }
    if(noleft == false) {
        for(int i = 0; i < 4; i++) {
            TetrisParts part = parts.get(i);
            part.x--;
        }
    }
}

字段 int 数组的代码:

int fields[][] = new int[WORLD_WIDTH][WORLD_HEIGHT];

WORLD_WIDTH 和 WORLD_HEIGHT 都是静态最终整数,宽度为 9,高度为 19

我试过把 if(tetrisworld.fields[0][0] == 0) 和它仍然崩溃,所以我认为它与变量无关。即使我还没有添加代码来检查它也不会超出界限,因为我在 x = 5 附近产生了 teroid 并且因为一旦没有机会我就不能向左/向右走正在发生

我尝试将 goLeft/Right 方法移动到具有“world = TetrisWorld();”的游戏屏幕类 它仍然在同一个地方出错

更新:

好的,只需添加:

tetrisworld != null

对于第一个 if 语句修复它,我现在的问题是,它为什么修复它?为什么没有这张支票我不能搬家?据我所知,这显然不是无效的原因;它现在完全响应。

但是解决这个问题的一种更简单的方法是改变fields为静态......然后像这样访问它:TetrisWorld.fields所以我更新的代码是:

public void goLeft()
  {
  noleft = false;
  for (int i = 0; i < 4; i++)
     {
     part = parts.get(i);
     if (part.x - 1 < 0 || TetrisWorld.fields[part.x - 1][part.y] != 0)
        {
        noleft = true;
        break;
        }
     }
  if (noleft == false)
     {
     for (int i = 0; i < 4; i++)
        {
        part = parts.get(i);
        part.x--;
        }
     }
  }
4

3 回答 3

0

看起来您正在点击 IndexOutOfBoundsException。

当您这样做x = part.x - 1;时,您的x变量可能会变得小于零,因此您的代码将像if(tetrisworld.fields[-1][part.y] != 0

于 2012-01-22T08:49:38.490 回答
0

看起来您在java.lang.NullPointerException尝试访问tetrisworld. 在您提到的行中,有几种可能发生这种情况的方式:

if(tetrisworld.fields[x][part.y] != 0) {
  1. tetrisworld可以为空。
  2. fields成员tetrisworld可以为空。
  3. 您正在查找的第二个数组使用tetrisworld.fields[x].
  4. 的值part可以为空。

快速浏览一下你的源代码,在我看来你从来没有初始化过tetrisworld,无论是在声明中使用:

TetrisWorld tetrisworld = new TetrisWorld();

goLeft()或者在调用您的方法之前肯定已经发生的其他某个时间点。

于 2012-01-23T09:21:18.817 回答
0

好的,我相信我找到了答案,参考:http ://en.wikipedia.org/wiki/Null_Object_pattern

如果你有一个空引用,如果你不先检查它,显然java会抛出一个NPE?有什么方法可以在不执行 a 的情况下对其进行初始化,TetrisWorld tetrisworld = new TetrisWorld();因为它已经在不同的类中创建,所以我得到一千个错误,一个实际的堆栈溢出!lul ...仍然不是100%积极的。请发表评论以进行验证,并可能提出更好的解决方法。

于 2012-01-29T01:44:49.257 回答