Получение ArrayLists IndexOutBoundsException - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь создать планировщик процесса в Java. У меня есть пример класса процесса и класс планировщика, где я делаю логику планирования. Я получаю сообщение об ошибке в первой строке метода First Come First Server (FCFS).

Queue.add(Arriving.get(0));

Исключение в потоке "основной"Источник)

public class Scheduler {

    // I use two lists to keep track of the processes that haven't arrived and the processes in the cpu queue
    ArrayList<Process> Arriving;
    ArrayList<Process> Queue;
    Process runningProcess;
    int currentTime;
    // new process boolean used to check if a process was added to the cpu queue
    boolean newProcess;

    public Scheduler(ArrayList<Process> Queue){
        Arriving = new ArrayList<Process>();
        Queue = new ArrayList<Process>();
        for (int i = 0; i<Queue.size(); i++) {
            Arriving.add(Queue.get(i));
        }
        Sort();
        currentTime = 0;
    }

    public void FCFS(){
        Queue.add(Arriving.get(0));
        Arriving.remove(0);
        runningProcess = Queue.get(0);
        while(runningProcess.getRemainingTime() != 0){
            if (runningProcess.getRemainingTime()==0){
                Queue.remove(runningProcess);
                runningProcess = Queue.get(0);
            }

            while (Arriving.get(0) != null){
                for(Process process:Arriving){
                    if (process.getArrivalTime()==currentTime){
                        Queue.add(Arriving.get(0));
                        Arriving.remove(0);
                    }
                    else
                        break;
                }
                runningProcess.running();
                for(int i = 1; i<Queue.size(); i++)
                    Queue.get(i).waiting();
            }
            System.out.println(Queue.size() + " processes waiting.");
            currentTime++;
        }
    }

public class Main {

    public static void main(String[] args) {
        Process a = new Process(1, 15, 0, 0);
        Process b = new Process(2, 9, 5, 0);
        Process c = new Process(3, 3, 8, 0);
        Process d = new Process(4, 12, 10, 0);
        Process e = new Process(5, 4, 14, 0);
        ArrayList<Process> queue = new ArrayList<Process>();
        queue.add(a);
        queue.add(b);
        queue.add(c);
        queue.add(d);
        queue.add(e);
        Scheduler run = new Scheduler(queue);
        run.FCFS();
}
        public void Sort(){
        ArrayList<Process> Unsorted = new ArrayList<Process>();
        for (int i = 0; i < Arriving.size(); i++){
            Unsorted.add(Arriving.get(i));
        }
        ArrayList<Process> Sorted = new ArrayList<Process>();
        Process someProcess;
        for(int i = 0; i<Unsorted.size(); i++) {
            someProcess = Unsorted.get(i);
            for (Process process:Unsorted){
                if (process.getArrivalTime()<someProcess.getArrivalTime())
                    someProcess = process;
            }
            Sorted.add(someProcess);
            Unsorted.remove(someProcess);
        }
        Arriving = new ArrayList<Process>();
        for (Process process:Sorted) {
            Arriving.add(process);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Вы используете ArrayList в качестве очереди. Тест для пустой очереди - myList.isEmpty(), который вы должны проверить перед доступом к элементам.

В качестве альтернативы вы можете использовать java.util.Deque, который возвращает ноль, когда вы заглядываете в голову или хвост пустой декы с помощью peekFirst() или peekLast().

0 голосов
/ 02 ноября 2019

Добавьте проверку пустого списка перед выполнением Queue.add(Arriving.get(0));.

Это должно решить проблему.

Вы должны выполнять get () или remove (), только если что-то присутствует в List.

0 голосов
/ 02 ноября 2019

В коде вашего основного метода вы инициализируете queue, добавляя к нему экземпляры Process.

ArrayList<Process> queue = new ArrayList<Process>();
queue.add(a);
queue.add(b);
queue.add(c);
queue.add(d);
queue.add(e);
Scheduler run = new Scheduler(queue);

queue передается в конструктор Scheduler,только для повторной инициализации, таким образом удаляя все экземпляры Process, которые были в нем ранее.

public Scheduler(ArrayList<Process> Queue) {
    Arriving = new ArrayList<Process>();
    Queue = new ArrayList<Process>(); // Change this line to this.Queue = Queue
    for (int i = 0; i<Queue.size(); i++) {
        Arriving.add(Queue.get(i));
    }
    Sort();
    currentTime = 0;
}

Так что, когда вы пытаетесь перебрать все объекты в конструкторе, Queue.size() возвращает 0.

У вас есть ArrayList<Process> Queue в качестве члена класса, хотя это имя отражает локальную переменную Queue, которая была передана в Scheduler.

Вместо того, чтобы проходить через Queue идобавив все объекты к Arriving, вы можете просто установить Arriving = Queue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...