como corrigir NullPointerException em genéricos fila matriz circular

Kaijudile:

Eu estou tentando criar uma simulação básica aeroporto, utilizando duas filas. Eles são supostamente para alternar entre decolando, e quando não se tem mais 'aviões' esquerda, o NPE precisa ser tratada para que a outra fila pode continuar indo até que o loop terminou e ambas as filas acabarem, como um tem 7 entradas e o outro tem 4. Eu pensei que se eu tentei colocar um manipulador de exceção no método dequeue pode corrigi-lo, mas eu tenho que usar uma classe genérica para ele, para que não funcionou adequadamente. A partir de agora o loop for que se destina a runs dequeue até o quarto loop, que é quando ele pára, lança a NPE, e sai do programa. Então, minha pergunta é, como posso fazê-lo de modo que quando uma fila acabar, ele pára de tentar loop-lo e, em vez continua looping a última fila?

Aqui é a minha classe principal, onde o circuito está em execução:

public abstract class Airport<T> {

    public static void main(String[] args) {
        //creates separate queues
        Driver<Integer> runway1 = new Driver<>();
        Driver<Integer> runway2 = new Driver<>();

        //adds 7 planes into runway 1
        for (int i = 0; i < 7; i++) {
            runway1.enqueue(i);
        }

        //adds 4 planes into runway 2
        for (int i = 0; i < 4; i++) {
            runway2.enqueue(i);
        }

        int size1 = runway1.length();
        int size2 = runway2.length();

        //run loop while either runway has planes left
        while (size1 > 0 && size2 > 0) {
            System.out.println("There are currently " + size1 + " planes waiting for takeoff in Runway 1.");
            System.out.println("There are currently " + size2 + " planes waiting for takeoff in Runway 2.\n");


            for (int lane = 0; lane < 7; lane++) {
                int lane1, lane2;

                if (runway1.isEmpty()){
                    System.out.println("Runway 1 is empty.");
                }
                else {
                    lane1 = runway1.getFront();
                    System.out.println("Plane " + lane1 + " has taken off from Runway 1.");
                    runway1.dequeue();
                }

                if (runway2.isEmpty()){
                    System.out.println("Runway 2 is empty.");
                }
                else{
                    lane2 = runway2.getFront(); //EDIT: npe occurs here
                    System.out.println("Plane " + lane2 + " has taken off from Runway 2.\n");
                    runway2.dequeue();
                }

            }
        }

    }

}

E aqui está a parte da minha classe do driver:

class Driver<T> implements Queue1<T> {
    private static final int defaultSize = 10;
    private int maxSize; // Maximum size of queue
    private int front; // Index of front element
    private int rear; // Index of rear element
    private T[] listArray; // Array holding queue elements

    /**
     * Constructors
     */
    Driver() {
        this(defaultSize);
    }

    @SuppressWarnings("unchecked")
        // For generic array
    Driver(int size) {
        maxSize = size + 1; // One extra space is allocated
        rear = 0;
        front = 1;
        listArray = (T[]) new Object[maxSize]; // Create listArray
    }

    /**
     * Put "it" in queue
     */
    public void enqueue(T it) {
        assert ((rear + 2) % maxSize) != front : "Queue is full";
        rear = (rear + 1) % maxSize; // Circular increment
        listArray[rear] = it;
    }

    /**
     * Remove and return front value
     **/
    public T dequeue() {
        assert length() != 0 : "Queue is empty";
        T it = listArray[front];
        front = (front + 1) % maxSize; // Circular increment
        return it;
    }

    /**
     * Return Front Value
     **/
    @Override
    public T getFront() {
        assert length() != 0 : "Queue is empty";
        return listArray[front];
    }

    @Override
    public T getBack() {
        assert length() != 0 : "Queue is empty";
        return listArray[rear];
    }

    @Override
    public boolean isEmpty() {
        if(listArray == null){
            return true;
        }
        return false;
    }

    /**
     * @return Queue length
     **/
    public int length() {
        return ((rear + maxSize) - front + 1) % maxSize;
    }


}


Fui coçar a cabeça sobre isso por dias, então qualquer ajuda seria extremamente apreciada! Obrigado!

SecondThread:

O problema é que seu isEmpty()método não funciona do jeito que você quer que seja. Você está usando-o como se ele verifica se há algo na fila, mas é escrito para fazer outra coisa. Assumindo que o seu length()método é correto, você precisa verificar se length() == 0. Se isso acontecer, então você deve retornar true. Se não, você deve retornar false.

A razão que você está recebendo um NullPointerException é porque você está assumindo sua lista não está vazia quando é, assim que você tentar acessar a próxima coisa na sua fila, o que é null

No código, que seria parecido com este:

public boolean isEmpty() {
   return length()==0;
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=279854&siteId=1
Recomendado
Clasificación