通过双向链表调用迭代器时,出现了空指针异常。空指针异常发生在main行中assertEquals(i, (int) it.next());
/***************************
* nested class DequeIterator
***************************/
private class DequeIterator implements Iterator<E>
{
// instance data member of ListIterator
private Node current;
// constructors for ListIterator
public DequeIterator()
{
current = first; // head in the enclosing list
}
public boolean hasNext()
{
return current != null;
}
public E next()
{
if (hasNext() == false){ throw new NoSuchElementException();}
else {
E ret = current.item;
current = current.next;
return ret;
}
}
public void addLast(E item) {
if (item.equals(null)) { throw new NullPointerException(); }
else {
Node node = new Node(item, null);
Node ptr = last;
ptr.prev.next = node;
node.next = ptr;
node.prev = ptr.prev;
ptr.prev = node;
N++;
}
}
public static void main(String[] args) {
Deque<Integer> lst = new Deque<Integer>(); // empty list
for(int i = 1; i <= 5; i++) {
lst.addLast(i);
}
assertEquals(5, lst.size());
Iterator<Integer> it = lst.iterator();
int i = 1;
while(it.hasNext()) {
assertEquals(i, (int) it.next());
i++;
}
assertEquals(6, i);
assertEquals(5, lst.size());
}
谁能告诉我为什么我此时会得到一个空指针异常?
通过查看循环的终止条件开始:
public boolean hasNext(){
return current != null;
}
这意味着它最后一次运行时将返回null
,因为它仅检查当前元素而不是下一个元素是否为空。
因此,您的代码将如下所示:
Integer it_next = null;
assertEquals(i, (int)it_next);
而这int
就是引发异常的原因。如果查看拆箱的工作规则,则可以找出原因:
如果r是Integer类型的引用,则取消装箱转换会将r转换为r.intValue()
所以你的代码变得类似于
((Integer)null).intValue();
这是对null值的方法调用,从而导致异常。
据推测,你想这样做的解决方法是不返回true
的hasNext
,如果next
值null
。像这样:
public boolean hasNext(){
return current != null && current.next != null;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句