我一直在我的搜索方法中看到空指针异常,以便我实现跳过列表。
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复制了这个,所以我不确定它会出现什么问题。
答案 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