在指定的索引Java处将节点添加到双向链接列表时出现NullPointerException

时间:2011-04-18 03:31:48

标签: java linked-list nullpointerexception

我无法弄清楚我哪里出错了,我已经检查并重新检查了我的add(int index,T obj)方法无数次,仍然得到相同的错误。这是我的代码,任何指针都会非常感激;至少现在这个问题已经持续了一天左右。

package edu.neumont.csc250;


class LinkedList<T> implements List<T>{

    Node<T> head;
    Node<T> tail;
    int listCount;

    public LinkedList(){
        head = null;
        listCount = 0;
    }

    @Override
    public T get(int index) throws IllegalArgumentException {
        if(index > size() - 1 || index < 0){
            throw new IllegalArgumentException();
        }
        else{           
            Node<T> current = head;
            for(int i = 0; i < index; i++)
            {               
                current = current.next;
            }
            if(current.content != null){
                return current.content;
            }
            else{
                System.out.println("Null value.");
                return null;
            }
        }
    }

    @Override
    public void add(T obj) {
        if(head == null){
            head = new Node<T>(obj);
            head.next = null;
            tail = head;
            listCount++;
        }
        else{
            if(head.next == null){
                head.next = new Node<T>(obj);
                //head.next.next = null;
                tail = head.next;
                tail.prev = head;
                listCount++;
            }
            else{
                tail.next = new Node<T>(obj);
                tail.next.prev = tail;
                tail = tail.next;
                tail.next = null;
                listCount++;
            }
        }
    }

    @Override
    public void add(int index, T obj) throws IllegalArgumentException {
        // TODO Auto-generated method stub      
        Node<T> temp = new Node(obj);
        Node<T> current = head;

        for(int i = 0; i<=index; i++){
            current = current.next;
        }
        temp.prev = current.prev;
        current.prev = temp;
        current.prev.next = current;

        if(index == 0){
            head = current.prev;
        }
        else if(index == size()+1){
            tail = current.next;
        }

        listCount++;
    }

    @Override
    public void replace(int index, T obj) throws IllegalArgumentException {
        // TODO Auto-generated method stub
        if(index > size() - 1 || index < 0){
            throw new IllegalArgumentException();
        }
        else{
            //get(index)
        }

    }

    @Override
    public T remove() {
        head = head.next;
        listCount--;

        return null;
    }

    @Override
    public T remove(int index) throws IllegalArgumentException {
        // TODO Auto-generated method stub
        if(index > size() - 1 || index < 0){
            throw new IllegalArgumentException();
        }
        else{

            listCount--;
        }

        return null;
    }

    @Override
    public int size() {
        return listCount;
    }

    public static void main(String[] args){
        LinkedList<String> list = new LinkedList<String>();
        list.add("Red");
        list.add("Orange");
        list.add("Yellow");
        list.add("Green");
        list.add("Blue");
        list.add("Purple");

        for(int a = 0; a < list.size(); a++){
            System.out.println(list.get(a));
        }       
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
//      System.out.println(list.get(5).toString());
        System.out.println("There are " + list.size() + " colors in the list.");

        list.remove();

        for(int b = 0; b < list.size(); b++){
            System.out.println(list.get(b));
        }
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
        //System.out.println(list.get(5));
        System.out.println("There are " + list.size() + " colors in the list.");

        list.add(0, "Red");
        System.out.println(list.size());

        for(int c = 0; c < list.size(); c++){
            System.out.println(list.get(c));
        }
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
//      System.out.println(list.get(5).toString());
        System.out.println("There are " + list.size() + " colors in the list.");
    }

    class Node<T>{
        T content;
        Node<T> next;
        Node<T> prev;

        public Node(T content){
            this.content = content;
        }

        public T getContents(){
            return content;
        }

        public void printNode() {
            System.out.print("{" + content + "} ");
        }
    }
}

如果有任何帮助,这是我的控制台读数:

  

红   橙子   黄色   绿色   蓝色   紫色   列表中有6种颜色。   橙子   黄色   绿色   蓝色   紫色   列表中有5种颜色。   6   红色   黄色   绿色   蓝色   紫色   线程“main”中的异常   java.lang.NullPointerException at   edu.neumont.csc250.LinkedList.get(LinkedList.java:26)at   edu.neumont.csc250.LinkedList.main(LinkedList.java:161)

编辑:根据要求隔离主要方法:

public static void main(String[] args){
        LinkedList<String> list = new LinkedList<String>();
        list.add("Red");
        list.add("Orange");
        list.add("Yellow");
        list.add("Green");
        list.add("Blue");
        list.add("Purple");

        for(int a = 0; a < list.size(); a++){
            System.out.println(list.get(a));
        }       
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
//      System.out.println(list.get(5).toString());
        System.out.println("There are " + list.size() + " colors in the list.");

        list.remove();

        for(int b = 0; b < list.size(); b++){
            System.out.println(list.get(b));
        }
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
        //System.out.println(list.get(5));
        System.out.println("There are " + list.size() + " colors in the list.");

        list.add(0, "Red");
        System.out.println(list.size());

        for(int c = 0; c < list.size(); c++){
            System.out.println(list.get(c));
        }
//      System.out.println(list.get(0).toString());
//      System.out.println(list.get(1).toString());
//      System.out.println(list.get(2).toString());
//      System.out.println(list.get(3).toString());
//      System.out.println(list.get(4).toString());
//      System.out.println(list.get(5).toString());
        System.out.println("There are " + list.size() + " colors in the list.");
    }

1 个答案:

答案 0 :(得分:1)

当插入(add())索引为0时,新元素将插入第一个元素后面 但是,在操作完成后,头参考指向新插入的元素而不是实际的头元素 因此,当您迭代列表时会发生NPE 事实上,你可以从程序的输出中得到这个。请注意,第三次迭代从“Red”和“Orange”diappears开始。


而remove()的实现并不好,因为它会导致'内存泄漏'。它只是向前移动'头部'而不会使元素无效。