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

FCFS调度程序实现遇ArrayIndexOutOfBoundException问题求助

FCFS调度算法数组越界异常问题解决

问题描述

我是编程新手,正在实现FirstComeFirstServe(FCFS)调度算法。在向ArrivalTime数组输入第一个数据时,出现了ArrayIndexOutOfBoundException异常。我知道可能是低级错误,但找不到问题所在,恳请帮忙,感谢您的时间。

原代码

import java.util.Scanner;

public class FCFS_Practice {
    public static Scanner scanner = new Scanner(System.in);
    static int numberOfProcess;
    int[]ProcessID = new int[numberOfProcess];
    int[]ArrivalTime  = new int[numberOfProcess];
    int[]BurstTime = new int[numberOfProcess];
    int[]CompletionTime = new int[numberOfProcess];
    int[]TurnAroundTime = new int[numberOfProcess];
    int[]WaitingTime = new int[numberOfProcess];
    float avgWaitingTime,avgTurnAroundTime;

    public void takeInput(){
        System.out.println("Enter the number of process: ");
        numberOfProcess = scanner.nextInt();
    }
    public void inputArrivalAndBurstTime(){
        for(int i = 0;i < numberOfProcess;i++){
            System.out.printf("Enter Arrival Time for Process %d: ",i+1);
            ArrivalTime[i] = scanner.nextInt();
            scanner.nextLine(); // Buffer Flush
            System.out.printf("Enter Burst Time for Process %d: ",i+1);
            BurstTime[i] = scanner.nextInt();
            scanner.nextLine(); // buffer flush
            ProcessID[i] = i+1;
        }
    }
    public void calculateCompletionTime(){
        for(int i = 0 ; i < numberOfProcess ; i++){
            if(i==0){
                CompletionTime[0]=BurstTime[0];
            } else if (ArrivalTime[i]<CompletionTime[i-1]) {
                CompletionTime[i]=CompletionTime[i-1]+BurstTime[i];
            } else {
                 CompletionTime[i]=ArrivalTime[i]+BurstTime[i];
            }
        }
    }
    public void calculateTurnAroundAndWaitingTime(){
        for(int i = 0 ; i < numberOfProcess ; i++){
            TurnAroundTime[i]=CompletionTime[i]+ArrivalTime[i];
            WaitingTime[i]=TurnAroundTime[i]-BurstTime[i];
        }
    }
    public void getAvgWaitingTimeAndAvgTurnAroundTime(){
        for(int i = 0 ; i<numberOfProcess;i++){
            avgTurnAroundTime+=TurnAroundTime[i];
            avgWaitingTime+=WaitingTime[i];
        }
        avgWaitingTime = avgWaitingTime/numberOfProcess;
        avgTurnAroundTime = avgTurnAroundTime/numberOfProcess;
    }
    public void getTable(){
        System.out.println("ProcessNo.  ArrivalTime  BurstTime  CompletionTime  TurnAroundTime  WaitingTime");
        for(int i = 0 ; i < numberOfProcess ; i++){
            System.out.println(ProcessID[i]+"		"+ArrivalTime[i]+"		"+BurstTime[i]+"		"+CompletionTime[i]+"			"+TurnAroundTime[i]+"			"+WaitingTime[i]);
        }
    scanner.close();
    }
}

问题分析与修复

1. 数组越界的核心原因

numberOfProcess是静态变量,类加载时默认值为0,所以所有数组(ProcessID、ArrivalTime等)都被初始化为长度为0的空数组。后续在takeInput方法中修改numberOfProcess的值,但数组长度不会自动更新,因此访问ArrivalTime[i]时必然触发数组越界异常。

2. 修复步骤

将数组的初始化逻辑移到takeInput方法之后,也就是获取到用户输入的进程数后再创建数组。同时修正周转时间的计算公式(原代码中TurnAroundTime的计算是错误的,应该是完成时间减去到达时间)。

修复后的完整代码

import java.util.Scanner;

public class FCFS_Practice {
    public static Scanner scanner = new Scanner(System.in);
    static int numberOfProcess;
    int[] ProcessID;
    int[] ArrivalTime;
    int[] BurstTime;
    int[] CompletionTime;
    int[] TurnAroundTime;
    int[] WaitingTime;
    float avgWaitingTime, avgTurnAroundTime;

    public void takeInput() {
        System.out.println("Enter the number of process: ");
        numberOfProcess = scanner.nextInt();
        // 获取进程数后初始化数组
        ProcessID = new int[numberOfProcess];
        ArrivalTime = new int[numberOfProcess];
        BurstTime = new int[numberOfProcess];
        CompletionTime = new int[numberOfProcess];
        TurnAroundTime = new int[numberOfProcess];
        WaitingTime = new int[numberOfProcess];
    }

    public void inputArrivalAndBurstTime() {
        for (int i = 0; i < numberOfProcess; i++) {
            System.out.printf("Enter Arrival Time for Process %d: ", i + 1);
            ArrivalTime[i] = scanner.nextInt();
            System.out.printf("Enter Burst Time for Process %d: ", i + 1);
            BurstTime[i] = scanner.nextInt();
            ProcessID[i] = i + 1;
        }
    }

    public void calculateCompletionTime() {
        for (int i = 0; i < numberOfProcess; i++) {
            if (i == 0) {
                // 第一个进程的完成时间需要考虑到达时间
                CompletionTime[0] = ArrivalTime[0] + BurstTime[0];
            } else if (ArrivalTime[i] < CompletionTime[i - 1]) {
                CompletionTime[i] = CompletionTime[i - 1] + BurstTime[i];
            } else {
                CompletionTime[i] = ArrivalTime[i] + BurstTime[i];
            }
        }
    }

    public void calculateTurnAroundAndWaitingTime() {
        for (int i = 0; i < numberOfProcess; i++) {
            // 周转时间 = 完成时间 - 到达时间
            TurnAroundTime[i] = CompletionTime[i] - ArrivalTime[i];
            // 等待时间 = 周转时间 - 执行时间
            WaitingTime[i] = TurnAroundTime[i] - BurstTime[i];
        }
    }

    public void getAvgWaitingTimeAndAvgTurnAroundTime() {
        avgTurnAroundTime = 0;
        avgWaitingTime = 0;
        for (int i = 0; i < numberOfProcess; i++) {
            avgTurnAroundTime += TurnAroundTime[i];
            avgWaitingTime += WaitingTime[i];
        }
        avgWaitingTime = avgWaitingTime / numberOfProcess;
        avgTurnAroundTime = avgTurnAroundTime / numberOfProcess;
    }

    public void getTable() {
        System.out.println("ProcessNo.  ArrivalTime  BurstTime  CompletionTime  TurnAroundTime  WaitingTime");
        for (int i = 0; i < numberOfProcess; i++) {
            System.out.printf("%d\t\t%d\t\t%d\t\t%d\t\t\t%d\t\t\t%d\n",
                    ProcessID[i], ArrivalTime[i], BurstTime[i],
                    CompletionTime[i], TurnAroundTime[i], WaitingTime[i]);
        }
        scanner.close();
    }

    // 主方法用于测试
    public static void main(String[] args) {
        FCFS_Practice fcfs = new FCFS_Practice();
        fcfs.takeInput();
        fcfs.inputArrivalAndBurstTime();
        fcfs.calculateCompletionTime();
        fcfs.calculateTurnAroundAndWaitingTime();
        fcfs.getAvgWaitingTimeAndAvgTurnAroundTime();
        fcfs.getTable();
    }
}

额外修正说明

  • 原代码中第一个进程的完成时间没有考虑到达时间,修复后改为CompletionTime[0] = ArrivalTime[0] + BurstTime[0],符合FCFS的计算逻辑。
  • 移除了不必要的scanner.nextLine(),因为nextInt()只会读取数字,后续的nextInt()会自动跳过前面的空白字符。
  • 初始化了avgWaitingTime和avgTurnAroundTime的初始值为0,避免出现脏数据。
  • 添加了主方法,方便直接运行测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:55:18