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

Java中计算抛射体射程时二维数组双循环触发数组越界错误的解决方法

解决抛射体射程程序的ArrayIndexOutOfBoundsError问题

嘿,这个数组越界的问题我在做物理模拟程序时碰到过好多次,咱们一步步拆解排查,肯定能搞定!

最常见的几个原因&修复方法

1. 二维数组初始化的大小不匹配

你要存储的是每个速度×每个角度的组合结果,所以二维数组的行数应该等于速度数组的长度,列数等于角度数组的长度。很多时候会搞反行和列,或者直接给了固定大小(比如硬写个5×5),导致后续遍历的时候越界。

举个反例:

double[] speeds = {10, 20, 30};
double[] angles = {30, 45, 60};
// 错误:行数和列数搞反了,或者大小不够
double[][] ranges = new double[angles.length][speeds.length]; 

修复方式:

// 正确:行数=速度数组长度,列数=角度数组长度
double[][] ranges = new double[speeds.length][angles.length];

2. 循环遍历用了错误的边界条件

数组的索引是从0到length-1,如果循环里用了<=而不是<,或者把数组长度当成了最大索引,肯定会触发越界。

反例:

// 错误:i <= speeds.length 会让i取到speeds.length,超出索引范围
for (int i = 0; i <= speeds.length; i++) {
    for (int j = 0; j <= angles.length; j++) {
        ranges[i][j] = calculateRange(speeds[i], angles[j]);
    }
}

修复方式:

// 正确:用 < 来限制循环边界
for (int i = 0; i < speeds.length; i++) {
    for (int j = 0; j < angles.length; j++) {
        ranges[i][j] = calculateRange(speeds[i], angles[j]);
    }
}

3. 遍历逻辑中搞混了数组的索引

有时候会不小心把速度的索引用到角度数组上,或者反过来,比如在计算时写错了speeds[j]而不是speeds[i],这也会导致当两个数组长度不同时触发越界。

反例:

// 错误:把角度的索引j用到了速度数组上
ranges[i][j] = calculateRange(speeds[j], angles[j]);

修复方式:

// 正确:对应好各自的索引
ranges[i][j] = calculateRange(speeds[i], angles[j]);

完整的修复示例代码

这里给你一个能正常运行的Java示例,包含射程计算逻辑和正确的数组操作:

public class ProjectileRangeCalculator {
    public static void main(String[] args) {
        // 示例输入数组
        double[] launchSpeeds = {15, 25, 35};
        double[] launchAngles = {20, 45, 60}; // 单位:度
        
        // 初始化正确大小的二维数组
        double[][] rangeResults = new double[launchSpeeds.length][launchAngles.length];
        
        // 遍历所有组合计算射程
        for (int i = 0; i < launchSpeeds.length; i++) {
            double speed = launchSpeeds[i];
            for (int j = 0; j < launchAngles.length; j++) {
                double angle = Math.toRadians(launchAngles[j]); // 转成弧度
                // 抛射体射程公式:(v² * sin(2θ))/g,g取9.8m/s²
                double range = (Math.pow(speed, 2) * Math.sin(2 * angle)) / 9.8;
                rangeResults[i][j] = Math.round(range * 100) / 100.0; // 保留两位小数
            }
        }
        
        // 打印结果验证
        for (double[] row : rangeResults) {
            for (double val : row) {
                System.out.print(val + "\t");
            }
            System.out.println();
        }
    }
}

额外排查小技巧

  • 打印数组的长度:在循环前加System.out.println("速度数组长度:" + speeds.length);,确认你遍历的边界和数组实际长度匹配。
  • 调试时观察索引值:用IDE的断点功能,看循环变量i和j的取值,是不是超出了数组的最大索引。

内容的提问来源于stack exchange,提问作者Ethan Stedman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:16:13