2012-01-31 129 views
0

希望你们能弄清楚为什么即时得到什么,我可以提供一个空指针异常,该方案有几个类和方法,但这是打破了一个。空指针异常在if语句

public void search(Node node, String sData, int iData) 
{ 
    if (sData.equals(node.getString()) && (iData == node.getInt())) 
    { 
     System.out.println("Nailed it"); 
    }else if (sData.compareTo(node.stringData) < 0) 
    { 
     search(node.left, sData, iData); 
    }else if (sData.compareTo(node.stringData) > 0) 
    { 
     search(node.right, sData, iData); 
    } 

} 

是首先让输入节点是根,然后它会向左或向右从那里通过递归,但是这行的示数是if语句往上顶。无法弄清楚什么是错误的当调用方法时,sData只是一个标准的字符串输入,而iData也只是一个int输入。不能弄清楚= /感谢您的帮助

+0

如果一个节点没有正确的节点,也就是说节点可能为空。该节点是一片叶子。所以你必须检查null。 – rapadura 2012-01-31 23:47:19

+2

我的猜测是,您正在查找的值不在搜索树中(或者您的初始if语句未按预期工作),最终导致node.left或node.right在到达叶节点时变为null节点。下一次搜索调用将尝试调用node.getString(),然后抛出空指针异常。 – Bill 2012-01-31 23:48:13

回答

3

您需要添加以下你的方法顶部:

if (node == null) return; 

这将确保该方法,如果你搜索的东西并不在结构中存在返回正常。否则,使用您现有的代码,当方法遇到叶节点时您将遇到NullPointerExceptions

+0

你摇滚......太难了。我的朋友 – CMOS 2012-01-31 23:56:07

+0

不知道默默回归是什么在这里最好;这首先造成了他的麻烦。捕获异常将在选项上,在返回另一个之前打印调试语句。但是由于他的代码不检查不在树中的节点,可能默默地返回是所需的行为。 – 2012-01-31 23:59:08

+0

由于该方法具有返回类型'void',我认为在这种情况下,默默返回是期望的行为。理想情况下,该方法应返回节点(如果找到)或为空。 – Dawood 2012-02-01 00:04:31

3

两种可能性:SDATA或节点为null;你的递归调用可能会传递空节点,这就是我开始的。我真的不能告诉你更多的代码,对不起。

此外,考虑使用调试器来逐步执行代码,如果你不能找到错误。这通常有助于这样的代码。

+0

谢谢!我甚至没有想到,在初始调用之前,我认为它正在破裂的递归部分上出现错误!谢谢 – CMOS 2012-01-31 23:57:03