Java实现分数统计程序时出现数组索引越界异常求助
Java数组索引越界问题修复
异常根因
- Java数组索引从0开始计数,你定义的int数组长度为10,合法索引范围是
0~9,但所有循环都从i=1开始、到i<=10结束,当执行到i=10访问array[10]时,就会直接触发ArrayIndexOutOfBoundsException。 - 代码硬编码数组长度为10、循环上限为10,和需求要求的「最多支持100个分数输入」不符。
- 输入逻辑未实现「输入负数即终止」的判断,强制要求用户输入满10个数值才会停止,不符合需求规则。
- 未实现double类型分数的存储逻辑、对应double数组的重载
average方法,也未完成大于等于/低于平均分的分数统计、结果输出逻辑。 - 现有
average方法逻辑错误:遍历写死循环上限10,未按实际有效输入长度遍历,返回值固定为1,没有返回真实计算的平均分。
修复点说明
- 所有数组遍历逻辑改为从索引
0开始,循环上限为数组实际长度-1,彻底解决索引越界问题。 - 初始化长度为100的int、double类型分数数组,满足最多100个输入的要求。
- 输入逻辑增加负数判断,输入负数时直接终止输入流程;同时自动识别输入值类型,整数存入int数组、浮点数存入double数组,分别记录两类分数的有效输入个数。
- 补全double类型数组的重载
average方法,方法内按数组实际长度遍历计算平均分。 - 输入结束后自动裁剪数组成有效长度(剔除初始化的默认0值),计算所有分数的总平均分,遍历所有有效分数统计大于等于、低于平均分的个数并打印结果。
修复后完整代码
import java.util.Scanner; import java.util.Arrays; public class scorebyme { // int数组重载求平均分方法 public static int average(int[] array) { int sum = 0; for (int i = 0; i < array.length; i++) { sum += array[i]; } return array.length == 0 ? 0 : sum / array.length; } // double数组重载求平均分方法 public static double average(double[] array) { double sum = 0; for (int i = 0; i < array.length; i++) { sum += array[i]; } return array.length == 0 ? 0 : sum / array.length; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); // 初始化最多存储100个分数的两类数组 int[] intScores = new int[100]; double[] doubleScores = new double[100]; int intCnt = 0, doubleCnt = 0; double totalSum = 0; System.out.println("Enter the scores:(entering negative will terminate the program::): "); // 最多输入100个分数 for (int i = 0; i < 100; i++) { if (sc.hasNextInt()) { int num = sc.nextInt(); if (num < 0) break; intScores[intCnt++] = num; totalSum += num; } else if (sc.hasNextDouble()) { double num = sc.nextDouble(); if (num < 0) break; doubleScores[doubleCnt++] = num; totalSum += num; } else { // 输入非数字直接跳过 sc.next(); System.out.println("Invalid input, please enter number:"); i--; } } sc.close(); // 裁剪数组为实际有效长度 int[] validIntScores = Arrays.copyOf(intScores, intCnt); double[] validDoubleScores = Arrays.copyOf(doubleScores, doubleCnt); int totalCount = intCnt + doubleCnt; if (totalCount == 0) { System.out.println("No valid scores input."); return; } // 调用重载方法分别计算两类数组平均分 int intAvg = average(validIntScores); double doubleAvg = average(validDoubleScores); // 计算总平均分 double totalAvg = totalSum / totalCount; // 统计大于等于、低于平均分的个数 int aboveOrEqual = 0, below = 0; for (int i = 0; i < validIntScores.length; i++) { if (validIntScores[i] >= totalAvg) { aboveOrEqual++; } else { below++; } } for (int i = 0; i < validDoubleScores.length; i++) { if (validDoubleScores[i] >= totalAvg) { aboveOrEqual++; } else { below++; } } // 输出结果 System.out.printf("Int array average: %d\n", intAvg); System.out.printf("Double array average: %.2f\n", doubleAvg); System.out.printf("Total average of all scores: %.2f\n", totalAvg); System.out.printf("Scores above or equal to average: %d\n", aboveOrEqual); System.out.printf("Scores below average: %d\n", below); } }
注:代码中调用
Arrays.copyOf方法需要导入java.util.Arrays包,如果你不想用这个方法,也可以手动遍历创建对应长度的数组填充有效元素。
内容的提问来源于stack exchange,提问作者Atul Sharma
相关产品推荐
相关产品推荐

