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,让传入的学生编号和类内的判断逻辑完全匹配。
- 方案A:保留demo中从0开始的索引逻辑,修改
- 修正
setName方法的固定存储逻辑:将硬编码的names[NUM_STUDENT - 1] = name;改成按传入的学生编号对应存储,比如索引规则统一为从1开始时,调整为names[studentNum - 1] = name;。
内容的提问来源于stack exchange,提问作者AProgrammer
相关产品推荐
相关产品推荐

