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
相关产品推荐
相关产品推荐

