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

ram*_*ssa -1 java arrays multidimensional-array

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

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19
    at Grid.addMines(Grid.java:77)
Run Code Online (Sandbox Code Playgroud)

添加地雷(第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;
        }

    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

这看起来很可疑:

int x = generator.nextInt(rows);
int y = generator.nextInt(columns);
Run Code Online (Sandbox Code Playgroud)

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

int x = generator.nextInt(columns);
int y = generator.nextInt(rows);
Run Code Online (Sandbox Code Playgroud)

或者更清楚:

int column = generator.nextInt(columns);
int row = generator.nextInt(rows);
Run Code Online (Sandbox Code Playgroud)

然后一直使用:

Foo[][] grid = new Foo[rows][columns];
...
grid[row][column] = ...;
Run Code Online (Sandbox Code Playgroud)

要么:

Foo[][] grid = new Foo[columns][rows];
...
grid[column][row] = ...;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我同意你的第二段,并且会这样做,但我确信X代表典型的行和Y列. (4认同)
  • @Mrambo:不,它确实没有.X值水平变化 - 就像列值一样.Y值垂直变化,就像行值一样.如果表格或网格有5行,则任何单元格的Y值通常在0-4或1-5范围内.如果它有20列,则任何单元格的X值将在0-19或1​​-20范围内. (2认同)