-1

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

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

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

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

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

4

3 回答 3

2

我认为这个问题与你的Comparable.

如果该行while(tree.find(indexreg) != null) {抛出 a NullPointerException,那一定是因为treeis null。没有其他可能性是可信的。

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

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


(我可能会误解这个问题。当他说该行“导致”异常时,我假设 OP 的意思是“抛出”。

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

于 2011-06-05T04:43:41.227 回答
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));
}

您也不应该考虑提高代码的清晰度:您有一个方法调用和一个测试相结合。虽然这本身并不“坏”,但恕我直言,将两者分开会更干净,并保留返回的值,以防你想用它做某事,如下所示:

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

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

于 2011-06-05T02:28:59.043 回答
0

可能 indexreg 为空,根本没有初始化。您当然应该按照@Bohemian 的建议对 find() 进行更具防御性的编码,但这可能是根本问题。或查看下面的下一条评论。

于 2011-06-05T02:35:29.073 回答