我对此代码有一个大问题,我不知道如何导致它:
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对象)。我尝试使用谷歌搜索,但我找不到有用的答案。有谁知道如何使这个代码工作?
答案 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
,则必须,因为tree
为null
。没有其他可能性是可信的。
使用null
或==
对象引用与!=
的比较不会引发NPE。因此,即使tree.find(...)
返回null
,也不会导致此异常。
传递null
值作为方法参数不会抛出NPE。因此,如果indexreg
为null
,则不会导致此异常。 (NPE 可能被find
方法或其调用的东西抛出,但堆栈跟踪不会在异常的原点与异常的原点显示不同的行。)
(我可能会误解这个问题。我认为当他说该行“导致”异常时OP意味着“抛出”。
不幸的是,OP只发布了代码片段,并没有向我们展示堆栈跟踪......这是关键的证据。)
答案 2 :(得分:0)
可能indexreg为null,根本没有初始化。你应该按照@Bohemian的建议更加防守地编写find(),但这可能是潜在的问题。或者参见下面的下一条评论。