0

我在我正在实现的跳过列表的搜索方法中不断看到空指针异常。

public V find(K key, SkiplistMapNode<K,V> header, int level){
    SkiplistMapNode<K,V> N = header;
    for (int i = level-1; i >= 0; i--){
        if ((N != null) && (N.getNext()[i] != null)){
            while (N.getNext()[i].getKey().compareTo(key) < 0){
                N = N.getNext()[i];
            }
        }
    }
    N = N.getNext()[0];
    if ((N != null) && (N.getKey().compareTo(key) == 0)) return N.getValue();
    else return null;
}

例外的行是:

while (N.getNext()[i].getKey().compareTo(key) < 0)

我几乎从这个页面复制了这个,所以我不确定它会有什么问题。

4

2 回答 2

2

假设前进到下一个节点,如果您多次访问该值,则N.getNext()需要记住它的值而不前进。

与迭代器相同:

 while (iterator.hasNext()) {
   if (iterator.next()!=null) {
     iterator.next().toString() // advances to the next item, which may be null
   }
 }

固定的:

 while (iterator.hasNext()) {
   Object next=iterator.next(); // advance once
   if (next!=null) { // check value
     next.toString() // use same value, without advancing
   }

}

很难从您的代码中分辨出您真正想要前进到下一个元素的位置,以及您再次需要元素值的位置。将下一个值存储在变量中,然后检查并使用该值,与上面的迭代器示例相同。

于 2013-11-22T13:28:30.480 回答
0

如果您访问一个对象方法,您应该确保该对象不为空。在你的情况下,在...

while (N.getNext()[i].getKey().compareTo(key) < 0)

这些...

N.getNext()  //the only really important one you seem not to be checking
N.getNext()[i]

可能为空,应该检查甚至可能(尽管可能性较小且值得商榷)

N
N.getNext()[i].getKey()
key
于 2013-11-22T12:58:46.300 回答