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

Java实现扫雷游戏遇数组越界异常(java.lang.ArrayIndexOutOfBoundsException:4)求助

搞定Java扫雷程序的数组越界异常

嘿,兄弟!刚看到你遇到的java.lang.ArrayIndexOutOfBoundsException: 4问题,这玩意儿我刚学二维数组的时候也踩过坑,给你掰扯清楚怎么解决~

首先得明白这个异常啥意思:你访问了二维数组里不存在的索引。比如你创建的是4行4列的网格,那行和列的合法索引都是0到3(因为数组索引从0开始算),结果你代码里不小心用到了索引4,自然就报错了。结合扫雷的场景,大概率是这几个地方出问题:

1. 随机生成地雷位置时范围错了

你用Random生成行或列的索引时,是不是没控制好范围?比如你的网格是4x4的,那应该生成0到3的随机数,但如果写了random.nextInt(4)其实是对的(因为这个方法返回的是0到参数-1的数),但要是不小心写成random.nextInt(5),就会生成0-4的数,那索引4就越界了!

给你个正确的地雷放置代码示例:

// 先假设你初始化了一个4x4的网格
char[][] grid = new char[4][4];
// 先把所有格子初始化为'0'
for (int i = 0; i < grid.length; i++) {
    for (int j = 0; j < grid[0].length; j++) {
        grid[i][j] = '0';
    }
}

Random random = new Random();
int mineCount = 5; // 假设用户输入的地雷数是5
int rows = grid.length;
int cols = grid[0].length;

while (count < mineCount) {
    // 生成合法的行索引:0到rows-1
    int r = random.nextInt(rows);
    // 生成合法的列索引:0到cols-1
    int c = random.nextInt(cols);
    // 避免重复在同一个位置放地雷
    if (grid[r][c] != 'X') {
        grid[r][c] = 'X';
        count++;
    }
}

2. 打印网格的循环条件写错了

打印网格的时候,是不是用了<=而不是<?比如你写了:

// 错误示例:i <= rows会导致i=4时越界
for (int i = 0; i <= rows; i++) {
    for (int j = 0; j <= cols; j++) {
        System.out.print(grid[i][j]);
    }
}

正确的应该是用<,因为数组长度是4的话,索引只到3:

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        System.out.print(grid[i][j] + " ");
    }
    System.out.println(); // 每行结束换行
}

额外提醒

还要注意用户输入的地雷数量不能超过网格的总格子数哦!比如4x4的网格最多16个地雷,如果用户输入20,那你的while循环会一直跑,虽然不会直接触发越界,但也是个bug,可以加个判断:

Scanner scanner = new Scanner(System.in);
int mineCount = scanner.nextInt();
if (mineCount > rows * cols) {
    System.out.println("地雷数量不能超过网格总格子数!");
    return;
}

按照上面的步骤检查你的代码,应该就能解决这个越界问题啦~

内容的提问来源于stack exchange,提问作者coder-rogue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:14