关于LinkedList实现的NPE,但是我创建了对象?

时间:2018-03-30 00:50:35

标签: java list pointers exception null

主运行时,空指针异常发生在:

stringList.add("Test");

,特别是在add函数中的这行JAList:

dummy.getNextNode().setNodePrev(node);

我不明白,因为在那时,dummy已初始化, dummy.getNextNode()为虚拟,node就在之前初始化。

我唯一的想法是,当我调用JAList的构造函数时,构造函数没有正确设置值?

JAList<String> stringList = new JAList<String>();

作为旁注,你为什么不需要&lt; E>当你创建构造函数?

JANode.java:

public class JANode<E> {

private E value;
private JANode<E> next;
private JANode<E> prev;

public JANode(E value, JANode<E> next, JANode<E> prev)
{   
    this.value = value;
    this.next = next;
    this.prev = prev;       
}

public E getValue()
{
    return value;
}

public void setNodeNext(JANode<E> next)
{
    this.next = next;
}

public JANode<E> getNextNode()
{
    return next;
}

public JANode<E> getPrevNode()
{
    return prev;
}

public void setNodePrev(JANode<E> prev)
{
    this.prev = prev;
}

}

JAList.java:

  public class JAList<E> {


    private int initialCapacity;
    private JANode<E> dummy;

    public JAList()
    {
        this.initialCapacity= 10;
        this.dummy = new JANode<E>(null, dummy, dummy);
    }

    public JAList(int initialCapacity)
    {
        this.initialCapacity = initialCapacity;
        this.dummy = new JANode<E>(null, dummy, dummy);
    }

    public E add(E e)
    {
        JANode<E> node = new JANode<E>(e, dummy, dummy);

        node.setNodeNext(dummy.getNextNode());
        dummy.getNextNode().setNodePrev(node);
        dummy.setNodeNext(node);
        node.setNodePrev(dummy);
        return e;
    }

    public JANode<E> getNode(E value)
    {
        JANode<E> local = dummy.getNextNode();

        while (local != dummy && local.getValue() != value)
        {
         local = local.getNextNode();
        }   

        return local;

    }

}

main.java:

public class main {

public static void main(String[] args)
    {
        JAList<String> stringList = new JAList<String>();
        stringList.add("Test");
        stringList.add("B");
        stringList.add("C");

        System.out.println(stringList.getNode("Test").getValue());      
        System.out.println(stringList.getNode("Test").getNextNode().getValue());

    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

原因:在调用JAList<E>的构造函数时,此行

this.dummy = new JANode<E>(null, dummy, dummy);

与执行此操作相同:

this.dummy = new JANode<E>(null, null, null);

因为您使用dummy作为参数,但Java默认会使用null初始化其值。因此,当您稍后执行:

dummy.getNextNode().setNodePrev(node);

这一部分:dummy.getNextNode()返回null并抛出NPE。

解决方案:将构造函数中的代码更改为:

this.dummy = null;

在您的add方法中,通过评估this.dummy是否为null来验证当前列表是否为空:

public E add(E e) {
    JANode<E> node = new JANode<E>(e, dummy, dummy);
    if (dummy == null) {
        dummy = node;
    } else {
        //your code for add goes here...
        //note: it has errors as well...
        //...
    }
    return e;
}