Java游戏开发:将大量if/else转循环时遇数组越界异常的解决
分析与修复Java游戏开发中的数组越界问题
问题原因分析
嘿,我来帮你拆解这个问题!你碰到的java.lang.ArrayIndexOutOfBoundsException: 16错误,核心原因是数组索引超出了合法范围:
- 你的
gamePosition数组是new JButton[13][16],Java数组下标从0开始,所以Y轴的合法索引范围是0~15(共16个元素) - 原来的循环里,你直接硬执行15次
++ballPositionY,完全没考虑ballPositionY的初始值:- 如果初始
ballPositionY已经是15,第一次++就会变成16,直接触发越界 - 哪怕初始值是1,1+15=16,循环到最后一次也会越界
- 如果初始
- 另外,即使碰到
baby2PositionY改变了ballDirection,循环仍然会继续跑,继续递增ballPositionY,导致后续的数组访问依然越界
修复方案
针对这些问题,我们需要调整循环逻辑,确保每一步的数组访问都在合法范围内,并且在触发碰撞或边界后立即停止循环:
修改后的代码
public void kickBall() { if(ballDirection == 1) { // 循环条件同时限制次数和当前Y坐标,双重保险避免越界 for (int y = 0; y < 15 && ballPositionY < 15; y++) { // 先清除当前位置的球图标 gamePosition[ballPositionX][ballPositionY].setIcon(bg_icon); // 先检查下一个位置是否合法,再执行移动 if (ballPositionY + 1 >= 16) { // 碰到边界,改变方向并停止移动 ballDirection = 2; break; } // 移动到下一个合法位置 ballPositionY++; gamePosition[ballPositionX][ballPositionY].setIcon(ball_icon); // 检查是否碰到baby2 if(ballPositionY == baby2PositionY) { gamePosition[ballPositionX][ballPositionY].setIcon(baby2_icon); ballDirection = 2; // 碰到后立即停止循环,避免继续移动导致越界 break; } } } }
关键修改点
- 循环条件增强:加入
ballPositionY < 15,确保每次循环时,下一个位置(ballPositionY+1)不会超出数组的Y轴最大索引(15) - 先检查再移动:在执行
++ballPositionY前,先判断下一个位置是否合法,从根源避免越界 - 碰撞后立即停止:碰到
baby2或边界时,用break跳出循环,不再继续执行后续的移动步骤,防止ballPositionY被继续递增导致越界 - 逻辑顺序调整:先清除当前位置图标,再处理移动和碰撞,逻辑更清晰合理
额外建议
- 可以把数组的维度定义成常量,比如
private static final int GRID_ROWS = 13; private static final int GRID_COLS = 16;,这样后续修改或判断时直接用常量,避免硬编码数字导致的错误 - 在处理游戏对象移动时,最好每次移动前都做边界检查,这是避免数组越界的通用准则
内容的提问来源于stack exchange,提问作者timireland
相关产品推荐
相关产品推荐

