2 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng) getBeforeHelper 方法找到帶有您的鍵的元素時(shí),它會(huì)嘗試獲取左邊的元素。如果您的左元素不存在,那將不起作用。在這種情況下,getBeforeHelper 返回為 null 的“current”。在這種情況下,您對(duì)該空元素調(diào)用 get() 并獲得空指針異常。

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
看起來您最終會(huì)遇到以下情況:
// this yields null
// v v
assertTrue(i - 1 == bst.search(i).getBefore().get());
// ^ ^
// attempt to access a method belonging to a null reference
考慮以下情況,在 中g(shù)etBeforeHelper,您有:
node != null(總是true在引起麻煩的測(cè)試中)
node.data == key(true當(dāng)您到達(dá)Node您正在尋找的位置時(shí))
node.left == null (想想看:什么時(shí)候會(huì)發(fā)生?)
在這種情況下,您實(shí)際上最終得到了該getBeforeHelper方法的以下主體(通過丟棄else您通過if測(cè)試的所有塊并丟棄if測(cè)試失敗的塊的所有內(nèi)容):
public Node getBeforeHelper(Node node, K key) {
Node current = null;
if(node != null) { // true
if(node.data == key) { // true
if(node.left != null) { // false
}
}
}
return current;
}
嗯,就在那里,你回來了null。
稍后,嘗試null.get()在您的斷言中進(jìn)行評(píng)估。
剩下要做的就是了解這種情況究竟何時(shí)發(fā)生并找到另一種非失敗的方法來處理它!我在上面給出了一些提示,但既然你真的在學(xué)習(xí),我會(huì)讓你弄清楚細(xì)節(jié):)。
添加回答
舉報(bào)