生命游戏邻居问题。数组索引超出范围的异常

时间:2013-11-18 18:19:53

标签: java conways-game-of-life

我正在制作生命游戏计划,但我遇到了一个问题。

如下所示,我正在尝试计算邻居的数量。

问题在于,当计算坐在设定网格边界上的坐标的邻居数时,会给出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;
}

3 个答案:

答案 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;
}