我正在尝试为Android制作一个俄罗斯方块游戏,以帮助学习Android的游戏编程。当按下按钮时,我的goLeft / Rights会中断,左边的代码位于字段int数组和列表部件数组中。 fields数组由引用的变量(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();”的gamescreen类中。它仍然在同一个地方出错
更新:
好的只是添加:
tetrisworld != null
到第一个if语句修复它,我现在的问题是,为什么要修复它?没有这张支票,为什么我不能搬家?据我所知,这显然不是空的原因;它现在已经完全响应了。
但是更容易解决这个问题的方法就是将fields
更改为静态...然后访问它lika所以: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--;
}
}
}
答案 0 :(得分:0)
看起来你正在击中IndexOutOfBoundsException。
当您执行x = part.x - 1;
时,您的x
变量可能会变为零点,因此您的代码将像if(tetrisworld.fields[-1][part.y] != 0
答案 1 :(得分:0)
在尝试访问java.lang.NullPointerException
中的数组时,您似乎获得了tetrisworld
。在你提到的那一行中,有几种方法可以实现:
if(tetrisworld.fields[x][part.y] != 0) {
tetrisworld
可以为null。fields
的{{1}}成员可以为空。tetrisworld
查找的第二个数组。tetrisworld.fields[x]
的值可以为null。快速浏览一下您的源代码,我认为您永远不会初始化part
,无论是在声明时使用:
tetrisworld
或者在调用TetrisWorld tetrisworld = new TetrisWorld();
方法之前肯定会发生的其他一些事情。
答案 2 :(得分:0)
好的,我相信我找到了答案,参考:http://en.wikipedia.org/wiki/Null_Object_pattern
如果你有一个空引用,如果你不先检查它,那么java会抛出一个NPE吗?有没有办法在不执行TetrisWorld tetrisworld = new TetrisWorld();
的情况下初始化它,因为它已经在不同的类中创建,所以我得到了一千个错误,一个实际的堆栈溢出! lul ...仍然没有100%积极。请评论以验证并可能建议更好的方法来解决这个问题。