2017-03-03 63 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