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
相关产品推荐
相关产品推荐

