You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:15:04