You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:33:20