Java:检查Comparable是否为null返回NullPointerException

时间:2011-06-05 02:26:45

标签: java null nullpointerexception comparable

我对此代码有一个大问题,我不知道如何导致它:

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

出于某种原因,将tree.find(indexreg)与null进行比较会导致NullPointerException。由于这是一个大学项目,我必须使用自己的二叉树实现而不是Java提供的实现。 tree是BinarySearchTree,indexreg是一个已经初始化的Comparable对象。这是BinarySearchTree类中的find代码:

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

它在树中查找对象,如果找不到它则返回null(我认为你不能返回一个空的Comparable对象)。我尝试使用谷歌搜索,但我找不到有用的答案。有谁知道如何使这个代码工作?

3 个答案:

答案 0 :(得分:2)

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

这相当于:

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

您也可以考虑提高代码的清晰度:您可以进行方法调用和测试。虽然这本身并不“坏”,但恕我直言,将两者分开会更加清晰, AND 获取保留的值,以防你想对它做一些事情,比如:

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"
}

有些人认为你应该避免这种编码风格。我倾向于同意他们的意见。

答案 1 :(得分:2)

我认为问题与您的Comparable没有任何关系。

如果第while(tree.find(indexreg) != null) {行引发NullPointerException,则必须,因为treenull。没有其他可能性是可信的。

  • 使用null==对象引用与!=的比较不会引发NPE。因此,即使tree.find(...)返回null,也不会导致此异常。

  • 传递null值作为方法参数不会抛出NPE。因此,如果indexregnull,则不会导致此异常。 (NPE 可能find方法或其调用的东西抛出,但堆栈跟踪不会在异常的原点与异常的原点显示不同的行。)


(我可能会误解这个问题。我认为当他说该行“导致”异常时OP意味着“抛出”。

不幸的是,OP只发布了代码片段,并没有向我们展示堆栈跟踪......这是关键的证据。)

答案 2 :(得分:0)

可能indexreg为null,根本没有初始化。你应该按照@Bohemian的建议更加防守地编写find(),但这可能是潜在的问题。或者参见下面的下一条评论。