0

I am very new to programming and to stackOverflow. I am implementing First Come First Serve(FCFS).But I am getting array index out of bound exception, while entering input in []ArrivalTime I can be a silly mistake but i can not figure out why ,Please help me

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)
Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Amit
  • 13
  • 2
  • your declared : static int numberOfProcess = 0; and then using it to create arrays, this creates Arrays of 0 length, thats why "Out of bounds" exception is thrown. Set numberOfProcess to atleast 1 or to the number of processes you want to enter – Syed Asad Manzoor Nov 19 '22 at 07:48
  • so sir i am using takeinput function to change the class variable number of process, so why it is not working and thank you for your response. – Amit Nov 19 '22 at 08:31

2 Answers2

0

You asked

Why getting IndexOutOfBoundsException with in shared snippet.

You declared static int numberOfProcess = 0; and creating many arrays of length 0, so every time you try to access those array you will get IndexOutOfBoundsException which thrown to indicate that an index of some sort (such as to an array, to a string, or to a vector) is out of range.

Workaround ?

  • Many ways to resolve it, one practice is to declare your array implementation size after reading numberOfProcess through your scanner and make their pointer static.
    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);
    ...
  • Other practice is just change the declaration type to list and traverse/allocate values accordingly.

Extra point

  • Please follow language model standards as well, like naming convention
Lunatic
  • 1,519
  • 8
  • 24
0

An ordinary array can not be resized once declared. So use ArrayList instead

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();
    }
}

You have started variable names with Upper case alphabet.. java coding conventions

I have changed variable names accordingly

ArrayList explained

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197