需要帮助来诊断NullPointerException

时间:2014-03-16 17:25:43

标签: java

我是仿制药的新手,我正在尝试制作链表。

这是Node_ class的代码。

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");
    }
}

Main class中的以下代码

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 个答案:

答案 0 :(得分: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变量的setter - 此时它已初始化为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");
    }
}

答案 1 :(得分:0)

实例化LinkedList后,它会创建一个新的Node并将其分配给startendptr。创建新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
    }
}