0

我正在使用递归方法制作扫雷,以打开与块“0”相邻的所有图块。

一切都很顺利,直到我得到标题中提到的异常。异常被触发if(removalList[num1][num2] == 1){return;},但确保将删除列表中的所有初始值设置为零。(供您参考,1表示该项目已被添加到removalList供以后删除)。

我还通过做检查它是否在界限内if(num1 > gameWidth || num2 > gameHeight || num1 < 0 || num2 < 0){return;}. (gameHeight and width are both 10),但由于某种原因它认为它超出了界限。

谢谢你的帮助!

private void function(int c5, int r5)
{
    int num1 = c5;
    int num2 = r5;

    if(num1 > gameWidth || num2 > gameHeight || num1 < 0 || num2 < 0)
    {
        return;
    }
    if(removalList[num1][num2] == 1)
    {
        return;
    }
    if(blocks[num1][num2] == 0)
    {       
        System.out.println("Added (" + num1 + ", " + num2 + ") to removal list.");
        removalList[num1][num2] = 1;

        function(num1-1, num2);
        function(num1, num2-1);
        function(num1+1, num2);
        function(num1, num2+1);

    }
    else if(blocks[num1][num2] > 0 && blocks[num1][num2] < 9)
    {
        removalList[num1][num2] = 1;
        return;
    }
    else
    {
        return;
    }
}
4

2 回答 2

1

没有看到进一步的代码,特别是 的声明removalList,我只能猜测。我的猜测是,它removalListgameWidth * gameHeight元素。所以索引从0togameWidth - 1和 from 0to运行gameHeight - 1。您的检查允许最高gameWidth和的索引gameHeight,这将导致您遇到异常。

于 2013-04-23T05:59:25.680 回答
1

如果数组的大小为 ,则数组中10可能的最大可访问索引为array[size-1]。如果您尝试访问大于或等于大小的索引,那么您将获得所谓的ArrayIndexOutOfBoundsException.

例如:-

int[] test = new int[5];
test[0] = 1; // Allowed
test[1] = 2; // Allowed
test[2] = 3; // Allowed
test[3] = 4; // Allowed
test[4] = 5; // Allowed
test[5] = 6; // NOT Allowed - You'll get the ArrayIndexOutOfBoundsException here.

因此,在您的情况下,

removalList[9][9]是允许的,但removalList[10][10]会给出ArrayIndexOutOfBoundsException

于 2013-04-23T05:57:35.950 回答