Java实现FCFS调度算法时出现数组越界异常,求排查解决
问题根源与修复方案
核心错误:数组初始化时机错误
你代码里的ProcessID、ArrivalTime等数组是在类实例化时就创建的,此时numberOfProcess的初始值是0,所以这些数组的长度都是0。后续在takeInput方法中修改numberOfProcess的数值,并不会改变已经创建的数组长度——数组一旦创建,长度就固定了。当你在inputArrivalAndBurstTime循环里访问ArrivalTime[i]时,自然会触发数组索引越界异常。
修复步骤
调整数组声明与初始化时机
把数组的声明和初始化分开,先在类里声明数组,等获取到numberOfProcess的值后再创建对应长度的数组:修改后的类成员变量部分:
public static Scanner scanner = new Scanner(System.in); static int numberOfProcess = 0; // 只声明数组,不初始化 int[] ProcessID; int[] ArrivalTime; int[] BurstTime; int[] CompletionTime; int[] TurnAroundTime; int[] WaitingTime; float avgWaitingTime = 0, avgTurnAroundTime = 0;然后在
takeInput方法中添加数组初始化逻辑: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]; }修正周转时间计算逻辑
你代码里calculateTurnAroundAndWaitingTime方法的周转时间计算有误,正确的公式是:周转时间(TurnAroundTime)= 完成时间(CompletionTime)- 到达时间(ArrivalTime)
修改后的方法:
public void calculateTurnAroundAndWaitingTime(){ for(int i = 0 ; i < numberOfProcess ; i++){ TurnAroundTime[i] = CompletionTime[i] - ArrivalTime[i]; WaitingTime[i] = TurnAroundTime[i] - BurstTime[i]; } }
额外提示
Java变量名规范一般采用小驼峰命名(比如processID而非ProcessID),虽然不影响运行,但养成规范的命名习惯能提升代码可读性。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

