Java 数组索引越界,使用多维数组作为游戏板

Java 数组索引越界,使用多维数组作为游戏板,java,arrays,multidimensional-array,bounds,Java,Arrays,Multidimensional Array,Bounds,此代码将检查12x12网格中的每个单元格,查看其值是否可以扩散或移动。x是标准地砖,P是球员,我是感染者。当玩家明显地从一个瓷砖移动到另一个瓷砖时,感染可以复制到任何相邻的瓷砖。出于某种原因,我不断得到一个java.lang.ArrayIndexOutOfBoundsException:-1错误,每当我达到一定的圈数时 有什么想法吗?(请保存调整代码,直到问题解决为止,谢谢。) publicstaticvoidtilemovement(字符t、整数i、整数j){ Random rand=新的Ra

此代码将检查12x12网格中的每个单元格,查看其值是否可以扩散或移动。x是标准地砖,P是球员,我是感染者。当玩家明显地从一个瓷砖移动到另一个瓷砖时,感染可以复制到任何相邻的瓷砖。出于某种原因,我不断得到一个java.lang.ArrayIndexOutOfBoundsException:-1错误,每当我达到一定的圈数时

有什么想法吗?(请保存调整代码,直到问题解决为止,谢谢。)

publicstaticvoidtilemovement(字符t、整数i、整数j){
Random rand=新的Random();
int dir=rand.nextInt(3);
//系统输出打印ln(t);
如果(t='x'){
}
else如果(t='I'){
双机会=数学随机();
//系统输出打印LN(机会);
如果(机会<0.35){
myGrid[i][j]=t;
交换机(dir){
案例0:
if(myGrid[i-1][j]='x'| | i!=1){
myGrid[i-1][j]=t;
打破
}
否则{
打破
}
案例1:
if(myGrid[i+1][j]='x'| i!=11){
myGrid[i+1][j]=t;
打破
}
否则{
打破
}
案例2:
if(myGrid[i][j-1]='x'| | j!=1){
myGrid[i][j-1]=t;
打破
}
否则{
打破
}
案例3:
如果(myGrid[i][j+1]='x'| | j!=11){
myGrid[i][j+1]=t;
打破
}
否则{
打破
}
}
}
}
else如果(t='P'){
myGrid[i][j]=“x”;//j=侧面,i=垂直
交换机(dir){
案例0:
如果(myGrid[i-1][j]='x'| | myGrid[i-1][j]='i'| | i!=1){
myGrid[i-1][j]=t;
打破
}
否则{
打破
}
案例1:
如果(myGrid[i+1][j]='x'| | myGrid[i+1][j]='i'| | i!=11){
myGrid[i+1][j]=t;
打破
}
否则{
打破
}
案例2:
如果(myGrid[i][j-1]='x'| | myGrid[i][j-1]='i'| | j!=1){
myGrid[i][j-1]=t;
打破
}
否则{
打破
}
案例3:
如果(myGrid[i][j+1]='x'| | myGrid[i][j+1]='i'| | j!=11){
myGrid[i][j+1]=t;
打破
}
否则{
打破
}
}
}
}

您错误地确定了电路板的边缘。以下是你的一句台词:

if(myGrid[i-1][j] == 'x'||i != 1){
首先,索引从0开始。其次,在尝试访问阵列之前,首先检查您是否位于左侧边缘。利用“短路”评估进行此操作:

if (i != 0 && myGrid[i - 1][j] == 'x') {
这里,如果
i
0
,则条件为
false
myGrid[i-1][j]='x'
从未计算过,并且它没有机会抛出
ArrayIndexOutOfBoundsException

您可以类似地更改其他条件。你是对的,11是这里的最大值

顺便说一句,在每种情况下,您通常在
if
条件的两种情况下都
中断
,而
else
只执行
中断
。仅在
if
之外打断
看起来更可读、更简洁:

if (condition) {
    // perform operation
}
break;

啊,我以为我做对了,但没有检查。它最初是0,然后我更改了它,因为我得到了一个一次性错误,实际上是因为另一个代码位。。谢谢你!
if (condition) {
    // perform operation
}
break;