java 我对编程很陌生,我正在实施先到先得(FCFS)[复制]

6mzjoqzu  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(93)

此问题在此处已有答案

What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?(26个答案)
昨天关门了。
我对编程和stackoverflow都很陌生。我正在实现先到先得(FCFS)。但是我在输入[]ArrivalTime时,遇到了数组索引越界异常。我可能犯了一个愚蠢的错误,但我不知道为什么,请帮助我

import java.util.Scanner;

public class FCFS_Practice {
    public static Scanner scanner = new Scanner(System.in);
    static int numberOfProcess = 0;
    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 = 0,avgTurnAroundTime = 0;

    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]+"\t\t"+ArrivalTime[i]+"\t\t"+BurstTime[i]+"\t\t"+CompletionTime[i]+"\t\t\t"+TurnAroundTime[i]+"\t\t\t"+WaitingTime[i]);
        }
    scanner.close();
    }
}

[Output](https://i.stack.imgur.com/z1CEd.png)
rslzwgfq

rslzwgfq1#

你问的
为什么在共享代码段中使用获取IndexOutOfBoundsException。
您声明了static int numberOfProcess = 0;并创建了许多长度为0的数组,因此每次尝试访问这些数组时都会得到IndexOutOfBoundsException,它被抛出以指示某种类型的索引(如数组、字符串或向量)超出范围。

解决方法

  • 有很多方法可以解决这个问题,其中一种做法是在通过扫描程序阅读numberOfProcess后声明数组实现大小,并使它们的指针为静态。
public static void main(String[] args) {
        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];
        ...
    }
    static int[] processID;
    static int[] arrivalTime;
    static int[] burstTime;
    static int[] completionTime;
    static int[] turnAroundTime;
    static int[] waitingTime;
    static Scanner scanner = new Scanner(System.in);
    ...
  • 其他做法是将声明类型更改为list,并相应地遍历/分配值。
    加分
  • 请同时遵循语言模型标准,如命名convention
nbysray5

nbysray52#

普通数组一旦声明就不能调整大小。因此请改用ArrayList

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class FCFS_Practice {
    public static Scanner scanner = new Scanner(System.in);
    static int numberOfProcess = 0;
    ArrayList<Integer> processID = new ArrayList();
    ArrayList<Integer> arrivalTime = new ArrayList();
    ArrayList<Integer> burstTime = new ArrayList();
    ArrayList<Integer> completionTime = new ArrayList();
    ArrayList<Integer> turnAroundTime = new ArrayList();
    ArrayList<Integer> waitingTime = new ArrayList();
    
   
   
    float avgWaitingTime = 0,avgTurnAroundTime = 0;

    public static void main(String[] args) throws IOException
      {
          FCFS_Practice practice = new FCFS_Practice();
          practice.takeInput();
          practice.initializeArrayList();
          practice.inputArrivalAndBurstTime();
          practice.calculateCompletionTime();
          practice.calculateTurnAroundAndWaitingTime();
          practice.getTable();
          
      }
    public void initializeArrayList()
    {
        for(int i=0; i < numberOfProcess;i++)
        {
            processID.add(0);
    arrivalTime.add(0);
    burstTime.add(0);
     completionTime.add(0);
     turnAroundTime.add(0);
     waitingTime.add(0);
        }
    }
    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.set(i,  scanner.nextInt());
            scanner.nextLine(); // Buffer Flush
            System.out.printf("Enter Burst Time for Process %d: ",i+1);
            burstTime.set(i, scanner.nextInt());
            scanner.nextLine(); // Buffer flush
            processID.set(i, i+1);
        }
    }
    public void calculateCompletionTime(){
        for(int i = 0 ; i < numberOfProcess ; i++){
            if(i==0){
                completionTime.set(0,burstTime.get(0));
            } else if (arrivalTime.get(i)<completionTime.get(i-1)) {
                completionTime.set(i,completionTime.get(i-1)+burstTime.get(i));
            } else {
                 completionTime.set(i, arrivalTime.get(i)+burstTime.get(i));
            }
        }
    }
    public void calculateTurnAroundAndWaitingTime(){
        for(int i = 0 ; i < numberOfProcess ; i++){
            turnAroundTime.set(i,completionTime.get(i)+arrivalTime.get(i));
            waitingTime.set(i,turnAroundTime.get(i)-burstTime.get(i));
        }
    }
    public void getAvgWaitingTimeAndAvgTurnAroundTime(){
        for(int i = 0 ; i<numberOfProcess;i++){
            avgTurnAroundTime+=turnAroundTime.get(i);
            avgWaitingTime+=waitingTime.get(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.get(i)+"\t\t"+arrivalTime.get(i)+"\t\t"+burstTime.get(i)+"\t\t"+completionTime.get(i)+"\t\t\t"+turnAroundTime.get(i)+"\t\t\t"+waitingTime.get(i));
        }
    scanner.close();
    }
}

您已经使用大写字母开始变量名.. java编码约定
我已经相应地更改了变量名称
ArrayList explained

相关问题