Java, односвязный список

143
21 апреля 2018, 19:59

Здравствуйте.

Недавно начал изучать Java, помогите пожалуйста разобраться почему вылетает NPE. Пытаюсь удалить узел в односвязном списке по значению.

public boolean delElementByValue(E value) {
        Node<E> resultNode = firstNode;
        while (resultNode != null) {
//NullPointerException в следующей строке
            if (resultNode.getNodeValue().equals(value)) {
                resultNode.getPrevNode().setNextNode(resultNode.getNextNode());
                return true;
            }
            resultNode = resultNode.getNextNode();
        }
        return false;
    }

Класс Node:

class Node<E> {
    private Node<E> prevNode;
    private Node<E> nextNode;
    private E nodeValue;
    Node(Node<E> prevNode, Node<E> nextNode, E nodeValue) {
        this.prevNode = prevNode;
        this.nextNode = nextNode;
        this.nodeValue = nodeValue;
    }
    public void setNodeValue(E nodeValue) {
        this.nodeValue = nodeValue;
    }
    public void setPrevNode(Node<E> prevNode) {
        this.prevNode = prevNode;
    }
    public void setNextNode(Node<E> nextNode) {
        this.nextNode = nextNode;
    }
    public Node<E> getPrevNode() {
        return prevNode;
    }
    public Node<E> getNextNode() {
        return nextNode;
    }
    public E getNodeValue() {
        return nodeValue;
    }
}

Смотрел в отладке. Цикл проходит 4 итерации и падает, в то время как value стоит на 10+ позиции. Что - то мне подсказывает что ошибка какая - то "детская", но догнать уже долгое время не могу. Заранее спасибо.

Answer 1

Когда вы удаляете Node, тогда метод resultNode.getNodeValue() будет возвращать null, а у него в свою очередь нет метода equals. Попытка его вызова вернет NullPointerException.

После того, как вы удаляете Node, текущую Node нужно смещать на следующую Node, а не оставлять на удаленной.

resultNode = resultNode.getNextNode();
READ ALSO
Как в MySQL принять BLOB-данные из MS SQL?

Как в MySQL принять BLOB-данные из MS SQL?

Фото лежит в MS SQL в поле типа IMAGEНужно передать его в MySQL в поле типа BLOB

210
Можно ли обойтись в дочерних таблицах без своего id?

Можно ли обойтись в дочерних таблицах без своего id?

Будет ли считаться правильным, если у дочерних таблиц будет такой же id, как и у родительской? (Внешние ключи будут совпадать)

173
Как создать класс, в котором каждый метод выполняется в новом потоке (Qt, c++)?

Как создать класс, в котором каждый метод выполняется в новом потоке (Qt, c++)?

У меня есть программа которая время от времени выполняет разные командыЗа вызов этих команд отвечает 1 класс(sender), а выполнять их должен другой(handler)

206
Чтение байтов/битов из памяти C++

Чтение байтов/битов из памяти C++

У меня есть файл с int числом в немЗначит в памяти этот файл занимает 4 байта

193