You need to enable JavaScript to run this app. Java成绩簿程序触发ArrayIndexOutOfBoundsException数组越界异常求助
优惠活动
大模型
产品
解决方案
定价
更多

Java成绩簿程序触发ArrayIndexOutOfBoundsException数组越界异常求助

数组越界报错原因与代码修正

报错本质

Index 4 out of bounds for length 4 是Java运行时典型的数组下标越界异常。Java数组下标从0开始计数,长度为4的数组合法索引范围是0~3,不存在索引为4的可访问位置。

具体错误定位

1. 直接触发报错的代码位置

在GradeBookDemo类的成绩读取循环中,有一处索引使用完全错位:

// 问题代码片段
double[] scores = new double[4]; // 数组长度为4,合法索引0-3
for (int i = 0; i < 4; i++) {
    scores[index] = inputfile.nextDouble();
}

这里的index是外层学生循环的变量,取值范围是0~4(对应循环条件index < 5)。当index=4时,代码尝试给长度为4的scores数组的第4位赋值,直接触发越界报错。

2. 代码中隐藏的其他逻辑问题(修正越界后也会触发其他异常/错误结果)

  • GradeBook类的setName方法逻辑错误:无论传入的学生编号是多少,始终将名字存入names[NUM_STUDENT - 1]也就是names[4]的位置,前4个学生的名字永远不会被正确赋值,所有输入的名字都会被反复覆盖。
  • 全代码的索引规则不统一:
    • GradeBookDemo类中所有方法调用传入的index是从0开始计数的(0到4对应5个学生)
    • 但GradeBook类中setScore、getAverage方法的分支判断是匹配1~5的数值、getName、getLetterGrade方法取值时用studentNum - 1的逻辑是按从1开始的索引设计的
      两套规则混用会导致:传入的index=0时,所有方法分支都匹配不到对应处理逻辑,成绩、名字全部无法正确存储,甚至会在调用时触发names[-1]这类负索引越界异常。

修正方案

  • 修正成绩读取的索引错误:将内层循环中给scores赋值的索引从外层的index改为内层循环变量i,保证正确遍历长度为4的成绩数组:
for (int i = 0; i < 4; i++) {
    scores[i] = inputfile.nextDouble();
}
  • 统一全代码的索引计数规则,二选一即可,禁止混用:
    • 方案A:保留demo中从0开始的索引逻辑,修改GradeBook类内的所有判断、取值逻辑,让方法适配0~4的学生编号范围,比如把getName的取值从names[studentNum - 1]改成names[studentNum],把setScore的分支判断从匹配15改成匹配04。
    • 方案B:保留GradeBook类中从1开始的索引逻辑,把demo中的两个for循环从index = 0; index < 5改成index = 1; index <= 5,让传入的学生编号和类内的判断逻辑完全匹配。
  • 修正setName方法的固定存储逻辑:将硬编码的names[NUM_STUDENT - 1] = name;改成按传入的学生编号对应存储,比如索引规则统一为从1开始时,调整为names[studentNum - 1] = name;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 13:06:03