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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:27:42