Java如何创建矩形二维数组?扫雷可变棋盘数组越界问题求解
问题根因分析
- 下标顺序写反:你初始化的二维数组
board = new Tile[rows][columns],第一维是行索引(对应你代码里的y变量),第二维是列索引(对应x变量),原代码中写board[x][y]把两个维度的索引搞反了,行列数不一致时必然触发越界。 - 循环边界错误:内层x的循环终止条件写了
board[y].length + 1,数组下标从0开始,最大合法下标是长度减1,加1后会多循环一次,直接访问到超出列长度的非法下标。
修复后的代码
public void genBoard(int columns, int rows) { board = new Tile[rows][columns]; // 遍历每一行 for (int y = 0; y < rows; y++) { // 遍历当前行的每一列 for (int x = 0; x < columns; x++) { board[y][x] = new Tile(x, y, 0, false); } } }
也可以直接用数组本身的长度属性替代硬编码的参数,代码可维护性更好:
public void genBoard(int columns, int rows) { board = new Tile[rows][columns]; // board.length对应总行数 for (int y = 0; y < board.length; y++) { // board[y].length对应当前行的总列数 for (int x = 0; x < board[y].length; x++) { board[y][x] = new Tile(x, y, 0, false); } } }
其他优化建议
- 增加参数合法性校验:方法开头先判断传入的行列数是否大于0,避免非法参数创建无效棋盘:
if (columns <= 0 || rows <= 0) { throw new IllegalArgumentException("棋盘行列数必须大于0"); }
- 循环变量命名可以更语义化:如果容易搞混xy对应的维度,可以把循环变量命名为
rowIdx、colIdx,大幅降低写反下标的概率。 - 逻辑解耦:后续生成雷区、计算格子周围雷数的逻辑,可以单独拆成方法,不要都堆在棋盘初始化方法里,后续排查问题更方便。
内容的提问来源于stack exchange,提问作者willguyturner
相关产品推荐
相关产品推荐

