跳过列表搜索空指针异常

时间:2013-11-22 12:50:02

标签: java search nullpointerexception skip-lists

我一直在我的搜索方法中看到空指针异常,以便我实现跳过列表。

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)

我几乎从this page复制了这个,所以我不确定它会出现什么问题。

2 个答案:

答案 0 :(得分: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
   }

}

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

答案 1 :(得分: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