2011-06-05 52 views
-1

我有這個代碼的一個大問題,我不知道如何使它:與的Java:檢查是否可比不爲空返回NullPointerException異常

while(tree.find(indexreg)!=null){ 
     //do stuff 
    } 

出於某種原因,比較tree.find(indexreg) null會導致NullPointerException。由於這是一個大學項目,我必須使用自己的二叉樹實現,而不是由Java提供的實現。樹是一個BinarySearchTree,indexreg是一個已經初始化的Comparable對象。這是BinarySearchTree類找到代碼:

public Comparable find(Comparable x) { 
     return elementAt(find(x, root)); 
    } 

它看起來在樹中的對象,如果沒有找到它(我不認爲你可以返回一個空的可比對象返回null )。我試過谷歌搜索,但我沒有找到有用的答案。有誰知道如何使這個代碼工作?

+4

NPE被拋出的確切線將是一個很好的信息給 – 2011-06-05 02:30:52

+4

你確定那'樹'不是'null'? – 2011-06-05 02:35:06

+3

另外,您還沒有顯示'elementAt()'的定義,或者'find()'的雙參數版本的定義。 – 2011-06-05 02:36:54

回答

2

我不認爲這個問題與你的Comparable有任何關係。

如果該行while(tree.find(indexreg) != null) {拋出一個NullPointerException,它必須因爲treenull。沒有其他可能性是可信的。一個對象引用的

  • 比較使用null==!=不會引發NPE。因此,即使tree.find(...)返回null,這不能成爲此例外的原因。

  • 傳遞null作爲方法參數的值不會拋出NPE。所以如果indexregnull,那不會導致這個異常。 (NPE 可能由find方法拋出或它調用的某個東西,但堆棧跟蹤不會以與異常起源不同的方法顯示不同的行。)


(我可能誤解的問題。我假設OP的意思是「拋出」時,他說行了「原因」的例外。

不幸的是,OP只發布代碼片段,並沒有向我們展示堆棧跟蹤...這是關鍵的證據)。

+0

是的,我的意思是線條拋出異常。我的錯。原來樹是空的,因爲我忘記調用構造函數,所以它崩潰了。對不起,不發佈更多的代碼,但我認爲這是在while條件中的某些語法錯誤。 – Magnus 2011-06-05 20:51:59

2
public Comparable find(Comparable x) { 
    return x == null ? null : elementAt(find(x, root)); 
} 

FYI這相當於:

public Comparable find(Comparable x) { 
    if (x == null) return null; 
    return elementAt(find(x, root)); 
} 

也拒絕考慮提高你的代碼的清晰度:你有一個方法調用和測試相結合。雖然這不是「壞」本身,恕我直言,這將是清潔劑分開的兩個,獲得的情況下,回到你想用它做什麼,這樣的價值的保持:

for (Comparable<?> result = tree.find(indexreg); result != null; result = tree.find(indexreg)) { 
    //do stuff with variable "result" 
} 

它只是讓控制循環的東西更加明顯。

還有另一種獲得結果的方法,但它被一些人認爲是「糟糕的編碼風格」即在一個分配和測試:

Comparable<?> result; 
while ((result = tree.find(indexreg)) != null) { 
    //do stuff with variable "result" 
} 

有些人認爲你應該避免這種編碼風格。我傾向於同意他們。

0

可能indexreg爲空,根本沒有初始化。您應該按照@Bohemian的建議更加防禦地編碼find(),但這可能是潛在的問題。或者看下面的下一條評論。

+2

或'tree'爲空... – 2011-06-05 02:36:40

+1

由於OP沒有向我們展示'elementAt'或兩個參數'find'的代碼,這個答案只不過是一個猜測... – 2011-06-05 02:38:15

+0

@Oli Charlesworth同意並且進行相應的修改和修改。在這種情況下,任何答案都是猜測。 – EJP 2011-06-05 02:43:14

相關問題