Нужна помощь в диагностике исключения NullPointerException [duplicate]

1

Я новичок в дженериках, и я пытаюсь сделать связанный список.

Вот код для класса Node_.

public class Node_<T> {

    private int index;
    private T data;
    private Node_<T> next;
    public Node_() {
    }

    public Node_(T data, int index) {
        this.data = data;
        this.index = index;
        next = null;
    }

    public void set(T data, int index) {
        this.data = data;
        this.index = index;
        this.next= null;
    }

    public void display() {
        System.out.println(this.data.toString());
    }

    public void setindex(int index) {
        this.index = index;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node_<T> getNext() {
        return next;
    }

    public boolean hasNext() {
        if (next != null) return true;
        else return false;
    }

    public int getIndex() {
        return this.index;
    }
}

и связанный класс списка.

public class LinkList<T> {    
    private int total = 0;
    private Node_<T> start;
    private Node_<T> end;
    private Node_<T> ptr;

    public LinkList() {
    }    

    public LinkList(T data) {
        start = new Node_<T>(data, 0);
        end = start;
        ptr = start;
        total++;
    }

    public void add(T data) {
        if (start == null) {
            start = new Node_<T>(data, 0);
            end = start;
            ptr = start;
            total++;
        } else {
            end.set((T) data,(int) total);
            total++;
            end = end.getNext();
        }
    }


    public void displayAt(int index) {
        if (start != null) {
            ptr = start;
            do {
                if (ptr.getIndex() == index)
                    ptr.display();
            } while (ptr.hasNext());
        }

        else
            System.out.println("No Element found");
    }

    public void displayAll() {
        if (start != null) {
            ptr = start;
            do {
                ptr.display();
            } while (ptr.hasNext());
        }

        else
            System.out.println("No Element Present");
    }
}

Следующий код в основном классе

public class Main {
    public static void main(String[] args) {    
        LinkList<Integer> list = new LinkList<Integer>(25);
        list.displayAll();
        for (int i = 0; i < 11; i++) {
            list.add((Integer) i);
        }
        list.displayAll();
    }

}

Я получаю следующую ошибку, и я не могу понять проблему.

25
Exception in thread "main" java.lang.NullPointerException
at LinkList.add(LinkList.java:26)
at Main.main(Main.java:8)

Любое предложение, где я ошибаюсь.

Теги:

2 ответа

3

Причина NullPointerException

Метод Node_.set() оставляет значение end.next null. Это означает, что после того, как вы столкнулись с циклом после получения исключения NullPointerException.

Исправлено add(Node_<T>) метода

Похоже, что вместо добавления нового узла в список вы устанавливаете содержимое последнего узла. Я думаю, вы должны построить новый узел, установив end.next чтобы указать на этот новый узел и, наконец, установить end как новый узел.

public void add(final T data) {
    if (start == null) {
        start = new Node_<T>(data, 0);
        end = start;
        ptr = start;
        total++;
    } else {
        end.setNext(new Node_<T>(data, total));
        total++;
        end = end.getNext();
    }
}

Следует отметить, что вам нужно будет обновить класс Node_, чтобы предоставить сеттер для next переменной - в настоящий момент он инициализируется null и не может быть изменен.

Исправить для displayAll()

И, наконец, как только вы создадите LinkedList, ваша программа displayAll далее перемещается по списку, если есть несколько элементов, она просто печатает первый элемент навсегда. Вам нужно включить ptr = ptr.getNext(). Что-то вроде этого работает:

public void displayAll() {
    if (start != null) {
        ptr = start;
        while (ptr != null) {
            ptr.display();
            ptr = ptr.getNext();
        }
    } else {
        System.out.println("No Element Present");
    }
}
  • 0
    Благодарю. Я такой глупый.
  • 0
    Я не могу понять, почему final используется в параметре add метода
Показать ещё 1 комментарий
0

Когда экземпляр LinkedList создается, он создает новый Node и назначает его для start, end и ptr. Когда новому Node создается next, присваивается значение null:

public Node_(T data, int index) {
    this.data = data;
    this.index = index;
    next = null; //assigned null
}

Затем метод add затем повторяется внутри тела цикла. Во время первой итерации end присваивается возвращаемое значение getNext которое равно null. На второй итерации вызывается метод end вызывающий NullPointerException.

public void add(T data) {
    if (start == null) {
        start = new Node_<T>(data, 0);
        end = start;
        ptr = start;
        total++;
    } else {
        end.set((T) data,(int) total); //end is null on second iteration
        total++;
        end = end.getNext(); //Set to null on the first iteration
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню