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

