Как избежать этого исключения NullPointerException в моем собственном классе связанного списка? - PullRequest
0 голосов
/ 25 марта 2020

Я проектирую нестатический c пустой метод, называемый unlinkNode, который принимает Node n в качестве параметра. Он должен гарантировать, что узел не связан с узлами до и после него. Необходимо изменить prev узла после n и следующий узел перед n. В настоящее время, когда я запускаю его, я получаю сообщение об ошибке

[ ERROR    ] exception in unit test code!
java.lang.
NullPointerException
    at LinkedList.unlinkNode(LinkedList.java:111)
    at UNITTEST.test_default(UNITTEST.java:19)
    at UNITTEST.main(UNITTEST.java:81)

Строка 111: n.getPrev (). Next = null;

Даже если я вставил операторы if, чтобы убедиться, что что если n - это хвост, чтобы не получить доступ к его предыдущему, и если его голова, чтобы не получить доступ к его следующему, чтобы убедиться, что ничего нулевого не получено.

Вот метод:

public void unlinkNode(Node n) {
    if(head != n && head != null) {
        n.getNext().prev = null;
    }
    if (tail != n && tail != null) {
        n.getPrev().next = null;
    }
}

И код, который все настраивает

public class LinkedList {
    public static class Node{
        String key;
        int value;
        Node next;
        Node prev;

        public Node(String key, int value) {
            this.key = key;
            this.value = value;
        }

        public Node getNext() {
            return next;
        }

        public Node getPrev() {
            return prev;
        }

        public String getKey() {
            return key;
        }

        public int getValue() {
            return value;
        }
    }

    private Node head;
    private Node tail;

    public LinkedList() {
        head = null;
        tail = null;
    }

    public Node getHead() {
        return head;
    }

    public Node getTail() {
        return tail;
    }


    public void addHead(String key, int val) {
        Node n = new Node(key, val);

        if(head == null) {
            head = n;
            tail = n;
        } else {
            head.prev = n;
            n.next = head;
            head = n;
        }
    }

    public void addTail(String key, int val) {
        Node n = new Node(key, val);

        if(tail == null) {
            head = n;
            tail = n;
        } else {
            tail.next = n;
            n.prev = tail;
            tail = n;
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Тщательно продумайте логику c. Или нарисуйте картинку для себя.

if(head != n && head != null) {
    n.getNext().prev = null;
}

Если предположить, что next, prev, head и tail имеют свои интуитивные значения, тест head != n не означает, что n будет иметь next. Это означает, что n будет иметь prev!

Кроме того ... как head может быть null при удалении узла из списка? Это поле будет null только в том случае, если список пуст, и вы не будете ничего удалять из пустого списка.

Так что, вероятно, выше должно быть:

if (head != n) {
    n.getPrev().next = null;
}

и примените то же самое мышление к следующему тесту.

(Примечание: я не могу его протестировать. Если предложенное мной исправление неверно, определите, каким оно должно быть для вас. Из первых принципов, как я. )

0 голосов
/ 25 марта 2020

Кажется, вы также присваиваете им нулевые значения, но проверки не завершены. Я бы предложил вам создать исключение NullPointerException, чтобы вы могли обрабатывать его самостоятельно, например, в блоке try catch. Это подготовит вас к сценарию ios, если значения равны нулю, вместо этого сделайте это.

try {
   // Your usual code here
} catch(NullPointerException e) {
   // Do something if it hit an NPE
}
0 голосов
/ 25 марта 2020

Я подозреваю, что "getPrev" возвращает ноль. Это мало кода, чтобы подтвердить это. Вы не можете видеть, вызывается ли addHead или addTail.

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