使用二维数组时索引超出范围

时间:2014-02-12 12:11:38

标签: java arrays multidimensional-array

我正在用Java创建一个基于文本的扫雷游戏。如果用户为游戏板创建一个完美的正方形,游戏可以正常工作,但是如果他们输入两个不同的值,我会在将地雷添加到二维数组中时出现异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19
    at Grid.addMines(Grid.java:77)

添加地雷(第77行是if语句):

public void addMines()
    {
        Random generator = new Random();
        int count = 0;

        while (count < numMines)
        {
            int x = generator.nextInt(rows);
            int y = generator.nextInt(columns);

            if (grid[x][y].minePresent == false)
            {
                grid[x][y].setCurrent("*");
                grid[x][y].minePresent = true;
                count++;
            }
            else
                continue;
        }

    }

4 个答案:

答案 0 :(得分:6)

这看起来很可疑:

int x = generator.nextInt(rows);
int y = generator.nextInt(columns);

鉴于x值通常指定列,我怀疑你想要:

int x = generator.nextInt(columns);
int y = generator.nextInt(rows);

或者更清楚:

int column = generator.nextInt(columns);
int row = generator.nextInt(rows);

然后始终使用:

Foo[][] grid = new Foo[rows][columns];
...
grid[row][column] = ...;

或:

Foo[][] grid = new Foo[columns][rows];
...
grid[column][row] = ...;

其中任何一个都没问题,但你的订单错误,因为你从“列/行”模型变为“x / y”模型不一致。

值得退一步,研究如何在将来诊断类似问题。如果某些东西在两个值相同(本例中为行和列)时有效,并且在它们不同时失败,则通常表示您正在使用其中一个值而不是另一个值。因此,请从错误点仔细跟踪您的代码,找出使用这些值的任何位置,并检查它们。

答案 1 :(得分:2)

问题在于访问您的游戏字段

if (grid[x][y].minePresent == false)
        {
            grid[x][y].setCurrent("*");
            grid[x][y].minePresent = true;
            count++;
        }

在这里你应该以相反的顺序访问它们:

grid[y][x].setCurrent("*"); // and so on

因为你创建二维数组的方式。

答案 2 :(得分:0)

网格的尺寸是否小于[rows] [columns]?

您可以通过执行以下操作来检查:

System.out.println(grid.length+"/"+rows);
System.out.println(grid[0].length+"/"+columns);

如果任何左边的值小于正确的值,那么你就有了罪魁祸首。如果您不小心提供了较小的数字,请查看网格的初始化。

答案 3 :(得分:-2)

根据文档http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28%29

,上面的Jon也给出了答案
  

所有2 ^ 32个可能的int值以(近似)相等的概率产生。

E.g。否定也将被退回。您必须使用Math.abs并执行int x = Math.abs(generator.nextInt(columns));