从2D数组抛出异常后继续

时间:2015-11-04 17:26:06

标签: java exception try-catch

我正在为我正在制作的Lights Out游戏构建模型,并且我一直遇到一个问题,即创建一个名为flipSwitch的方法。下面的代码翻转或关闭指定的框,但如果我单击边框上的框,它会抛出一个ArrayIndexOutOfBoundException,因为它无法关闭超出2D数组限制的框。

我已尝试使用try-catch块,但没有任何内容,但是即使它们存在,它也不会尝试关闭其余的块。我还尝试将continue;放入捕获,但它给出了错误,上面写着“继续不能在循环之外使用。”

换句话说,如何继续我的代码并基本上忽略抛出的异常?下图显示了我想要完成的任务。

private int[][] grid = new int[5][5];

public void flipSwitch(int row, int col)
    {
        if(getState(row, col) == ON){
            grid[row][col] = OFF;
            grid[row+1][col] = OFF;
            grid[row-1][col] = OFF;
            grid[row][col+1] = OFF;
            grid[row][col-1] = OFF;
        }else{
            grid[row][col] = ON;
            grid[row+1][col] = ON;
            grid[row-1][col] = ON;
            grid[row][col+1] = ON;
            grid[row][col-1] = ON;
        }
        clickCount++;
    }

1 个答案:

答案 0 :(得分:1)

为了使这项工作“忽略ArrayIndexOutOfBoundException”,每行try/catch行需要grid[..][..] = ..

try { grid[row][col] = OFF; } catch (Exception e) {};
try { grid[row+1][col] = OFF; } catch (Exception e) {};
try { grid[row-1][col] = OFF; } catch (Exception e) {};
try { grid[row][col+1] = OFF; } catch (Exception e) {};
try { grid[row][col-1] = OFF; } catch (Exception e) {};

正如你所看到的,它看起来很可怕。

编写以下方法会更好(也更清晰):

private void switchState(int row, int col, int status) {
    if (/* check if 'row' is in bound */ && /* check if 'col' is in bound */) {
        grid[row][col] = status;
    }
}

然后称之为:

switchState(row, col, OFF);
switchState(row + 1, col, OFF);
switchState(row - 1, col, OFF);
switchState(row, col + 1, OFF);
switchState(row, col - 1, OFF);

这首先避免了异常,并且更容易维护。如果您愿意,也可以使用其他名称:D。