2017-03-03 92 views
0

我試圖做一個二叉樹的實現的話每一個它有一個模式(如HELLO - 模式是ABCCD)空指針異常儘管檢查

我不斷收到一個空指針異常在線狀態

while(pos.getPattern() != null || a){ 

我不明白爲什麼 - 有檢查到位。此外,當我打印pos.getPattern() - 我得到一個字符串,不是一個空值

我真的可以使用一些幫助

public void AddWord(String word) { 
    TreeNode pos = root; 
    boolean a = true; 
    String pat = PatternMaker.MakePattern(word); 
    while(pos.getPattern() != null || a){ 

     if (pos.getPattern().equals(pat)) { 
      WordList list = pos.getList(); 
      list.insertWord(word); 
      pos.setList(list); 
      a = true; 
     } else if (pat.compareTo(pos.getPattern()) > 0) { 
      pos = pos.getRight(); 
     } else { 
      pos= pos.getLeft(); 

     } 
    } 
    if(pos ==null){ 
     pos = new TreeNode(word, pat); 
    } 
} 
+0

看起來'pos'在某些情況下可能爲空。如果是這樣,在空對象上調用'getPattern'將會拋出'NullPointerException' –

+0

你試過使用調試器嗎?它將幫助您快速發現哪個對象爲空。 – Milkmaid

回答

0

你的代碼有像pos = pos.getLeft()線。如果該方法返回null,則調用pos.getPattern()將拋出NPE。

+0

謝謝,事實證明,pos.getLeft()和getRight爲空,並添加一個檢查,解決了這個問題 –

0

空值檢查樹的節點是否爲空。您可以表示任何值來表示空節點,但不應與字符串的值重疊。如果您的集合必須是某種其他語言的String類型,則可以使用空字符串""來表示空值。建議將該值保留爲空,因爲它可以避免初始化成本,並使檢查運行更快。

由於@Teto解釋getPattern會在空字符串上拋出空指針。

2

您需要在while循環中添加null檢查pos

在某個點pos將在您的while循環內變爲null

public void AddWord(String word) { 
    TreeNode pos = root; 
    boolean a = true; 
    String pat = PatternMaker.MakePattern(word); 
    while((pos!=null && pos.getPattern() != null) || a){ 

     if (pos.getPattern().equals(pat)) { 
      WordList list = pos.getList(); 
      list.insertWord(word); 
      pos.setList(list); 
      a = true; 
     } else if (pat.compareTo(pos.getPattern()) > 0) { 
      pos = pos.getRight(); 
     } else { 
      pos= pos.getLeft(); 

     } 
    } 
    if(pos ==null){ 
     pos = new TreeNode(word, pat); 
    } 
} 

希望這有助於!

+0

我猜原來的海報意圖包括「if(pos == null)」條件在他的內部循環。這會阻止NPE,而且它在哪裏似乎毫無意義。在退出該方法之前立即重新初始化空引用似乎沒什麼意義。但也有可能有其他代碼被省略。 – Teto