我正在制作生命游戏计划,但我遇到了一个问题。
如下所示,我正在尝试计算邻居的数量。
问题在于,当计算坐在设定网格边界上的坐标的邻居数时,会给出ArrayIndexOutOfBoundsException错误。
为了解决这个问题,我使用了try和catch。
唯一的问题是,只要编译器检测到ArrayIndexOutOfBoundsException,它就会直接传递给catch部分,而不是通过其他if语句。
有什么方法吗?
public int neighbours(int x, int y) {
int result = 0;
try {
if (life[y + 1][x - 1] == '*') {
result++;
}
if (life[y + 1][x] == '*') {
result++;
}
if (life[y + 1][x + 1] == '*') {
result++;
}
if (life[y][x + 1] == '*') {
result++;
}
if (life[y][x + 1] == '*') {
result++;
}
if (life[y - 1][x] == '*') {
result++;
}
if (life[y - 1][x - 1] == '*') {
result++;
}
if (life[y][x - 1] == '*') {
result++;
}
} catch (ArrayIndexOutOfBoundsException e) {
}
return result;
}
答案 0 :(得分:1)
您可以在每个测试周围放置一个单独的try
/ catch
,以避免在其中一个引发异常时跳过其余部分,但更好的选择是事先检查数组的边界值。或者你可以让数组在每个边上都有一个未使用的额外行或列,然后不检查实际使用的单元格是否超出边界。
答案 1 :(得分:1)
试试这个:方法更容易维护,重复代码更少!
public int neighbours(int x, int y) {
int result = 0;
for(int i=x-1; i<=x+1;i++){
if(i<life.length && i>0){
for(int j=y-1; j<=y+1;j++){
if(j<life[i].length && j>0){
if (life[i][j] == '*') {
result++;
}
}
}
}
}
return result;
}
答案 2 :(得分:0)
改进Hache的代码:
public int neighbours(int x, int y) {
int result = 0;
for(int i=x-1; i<=x+1;i++){
//include border cell, so i>=0
if(i<life.length && i>=0){
for(int j=y-1; j<=y+1;j++){
//again, include border cell, so j>=0
if(j<life[i].length && j>=0){
//and to compare strings, please use equals()
if (life[i][j].equals("*")) {
result++;
}
}
}
}
}
//don't count the cell itself
return result - 1;
}