简体   繁体   English

将Node添加到指定索引Java的双向链接列表时发生NullPointerException

[英]NullPointerException when adding Node to Doubly Linked List at specified index Java

I cant figure out where I'm going wrong at all, I've checked and rechecked my add(int index, T obj) method countless times, still getting the same error. 我根本无法弄清楚哪里出了问题,我已经无数次地检查并重新检查了我的add(int index,T obj)方法,仍然收到相同的错误。 Here's my code, any pointers would be GREATLY appreciated; 这是我的代码,任何指针将不胜感激; this problem has been holding up my project for a day or so at least now. 这个问题使我的项目至少持续了一天左右。

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

Here's my console readout if it's of any help: 这是我的控制台读数,如果有帮助的话:

Red Orange Yellow Green Blue Purple There are 6 colors in the list. 红色橙色黄色绿色蓝色紫色列表中有6种颜色。 Orange Yellow Green Blue Purple There are 5 colors in the list. 橙色黄色绿色蓝色紫色列表中有5种颜色。 6 Red Yellow Green Blue Purple Exception in thread "main" java.lang.NullPointerException at edu.neumont.csc250.LinkedList.get(LinkedList.java:26) at edu.neumont.csc250.LinkedList.main(LinkedList.java:161) 6红色黄色绿色蓝色紫色线程“主”中的异常edu.neumont.csc250.LinkedList.get(LinkedList.java:26)上edu.neumont.csc250.LinkedList.main(LinkedList.java:161)上的java.lang.NullPointerException )

EDIT: main method isolated, as requested: 编辑:根据要求隔离主要方法:

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

When insert(add()) with index 0, the new element will be inserted behind the first element. 当insert(add())的索引为0时,新元素将插入到第一个元素的后面。
However, the head reference points to the newly inserted element rather than the actual head element after the operation is done. 但是,操作完成后,头部参考指向新插入的元素,而不是实际的头部元素。
Thus, a NPE will occur when you iterate your list. 因此,当您迭代列表时,将发生NPE。
In fact, you can get this from the output of the programe. 实际上,您可以从程序的输出中获得此信息。 Notice that the third iteration starts at 'Red' and the 'Orange' diappears. 请注意,第三次迭代从“红色”开始,然后出现“橙色”。


And the implementation of remove() is not good, for it'll lead to 'Memory Leak'. 而且remove()的实现不好,因为它会导致“内存泄漏”。 It just moves the 'head' forward without null-ing the element. 它只是将“头”向前移动而不会使元素为零。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM