数组索引超出范围?

时间:2013-04-26 19:50:58

标签: java eclipse

此方法应确定游戏最初是否结束以及某些动作之后是否结束。

public boolean isGameOver() {
    Point[] player1 = new Point[12];
    int p1 = 0;
    Point[] player2 = new Point[12];
    int p2 = 0;
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            if (board[i][j] == 1) {
                Point p = new Point(i, j);
                player1[p1] = p;
                p1++;
                //System.out.println(p.getX()+ " 1 " + p.getY());
            } else if (board[i][j] == 2) {
                Point p = new Point(i, j);
                player2[p2] = p;
                p2++;
                //System.out.println(p.getX()+ " 2 " + p.getY());
            }
        }
    }
    for(int i1=0;i1<player1.length;i1++) {
        ArrayList<Point> temp = getPossibleMoves(player1[i1]);
        if(temp.isEmpty())
            return true;
    }
    for(int i1=0;i1<player1.length;i1++) {
        ArrayList<Point> temp = getPossibleMoves(player2[i1]);
        if(temp.isEmpty())
            return true;
    }
    return false;
} 

问题是当我运行这些测试时,他们都有一个数组索引超出界限的错误 那些是测试

最初:

  @Test(timeout=1000)
public void testGameOverInitial() {
    assertFalse(board.isGameOver());
}
经过一些动作后

 @Test(timeout=1000)

public void testGameOverAfterSomeMoves() {
    board.move(new Point(1, 0), new Point(3, 2)); // White's turn
    board.move(new Point(0, 5), new Point(2, 5)); // Black's turn
    assertFalse(board.isGameOver());
}

2 个答案:

答案 0 :(得分:1)

您无法控制p1p2变量的值,因此它们可能大于数组长度。

有错误的行:

player1[p1]
p1++;

player2[p2]
p2++;

一种可能的解决方案是控制何时增加这些变量的值:

//similar for player2 and p2
if (p1 < player1.length) {
    p1++;
}

答案 1 :(得分:1)

由于p1p2嵌套在for循环中,因此它们最多可以增加到49而不是12,这是两个播放器数组的大小。

您可以检查p1的长度,如果它小于player1.length,就像@LuiggiMendoza建议的那样。或者你可以修复你的循环以及player数组的长度。

我不确定你要做什么。您需要为您要解决的问题选择最佳解决方案。