Java数组元素计数遇ArrayIndexOutOfBoundsException:索引与长度相同
问题排查与解决
1. 数组越界异常(ArrayIndexOutOfBoundsException)
问题根源在两处:
- 外层循环条件
i < letterGrade.length - 1:既会漏掉数组最后一个元素,还会因为内层循环修改i后,外层的i++导致i取值超出预期,最终触发索引越界(你的错误里索引125,刚好是长度125的数组的越界值)。 i += (count-1)逻辑错误:count统计的是当前元素之后的相同元素数量,未包含当前元素本身,偏移量计算错误会导致循环逻辑混乱。
调整方式:
- 外层循环条件改为
i < letterGrade.length,确保所有元素都能被遍历处理。 - 将count初始值设为1(计入当前元素),
i += (count - 1)保留即可(此时count包含当前元素,跳过count-1个元素刚好到下一个不同元素)。
2. 成绩计数重复、混乱
核心问题是输出位置和计数初始值错误:
- 输出语句放在内层循环中:每次
j循环都会执行打印,导致同一个成绩被重复输出。 - count初始值为0:未将当前元素
letterGrade[i]计入统计,导致最终计数比实际少1。
调整方式:
- 将
System.out.println移到内层循环外部,等count统计完所有相同元素后再打印,避免重复输出。 - count初始值设为1,确保统计数量准确。
调整后的完整代码
public static String gradesDistn() { String gradeDistn = "0"; Arrays.sort(letterGrade); for (int i = 0; i < letterGrade.length; i++) { int count = 1; // 先计入当前元素 for(int j = i + 1; j < letterGrade.length; j++) { if (letterGrade[i] == letterGrade[j]) count++; } // 统计完成后统一输出 gradeDistn = letterGrade[i] + ": " + count; System.out.println(gradeDistn); i += (count - 1); // 跳过已统计的相同元素,避免重复处理 } return gradeDistn; }
补充说明
原代码中gradeDistn每次都会被覆盖,最终返回的是最后一个成绩的统计结果,若需返回所有统计内容,可改为字符串拼接(如gradeDistn += letterGrade[i] + ": " + count + "\n";),但作业要求不能修改指定方法的话,保持原返回逻辑即可。
内容的提问来源于stack exchange,提问作者Loree
相关产品推荐
相关产品推荐

