主运行时,空指针异常发生在:
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());
}
}
谢谢。
答案 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;
}