Java:检查Comparable是否为null将返回NullPointerException
我对这段代码有一个大问题,我不知道如何引起它:Java:检查Comparable是否为null将返回NullPointerException,java,null,nullpointerexception,comparable,Java,Null,Nullpointerexception,Comparable,我对这段代码有一个大问题,我不知道如何引起它: while(tree.find(indexreg)!=null){ //do stuff } 出于某种原因,将tree.find(indexreg)与null进行比较会导致NullPointerException。由于这是一个大学项目,我必须使用自己的二叉树实现,而不是Java提供的实现。tree是一个BinarySearchTree,indexreg是一个已初始化的可比较对象。这是在BinarySearchTree类中查
while(tree.find(indexreg)!=null){
//do stuff
}
出于某种原因,将tree.find(indexreg)与null进行比较会导致NullPointerException。由于这是一个大学项目,我必须使用自己的二叉树实现,而不是Java提供的实现。tree是一个BinarySearchTree,indexreg是一个已初始化的可比较对象。这是在BinarySearchTree类中查找的代码:
public Comparable find(Comparable x) {
return elementAt(find(x, root));
}
它在树中查找对象,如果找不到,则返回null(我认为不能返回空的可比对象)。我试着用谷歌搜索,但没有找到有用的答案。有人知道如何使这个代码工作吗
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"
}
for(可比结果=tree.find(indexreg);结果!=null;结果=tree.find(indexreg)){
//使用变量“result”执行操作
}
它只是让我们更清楚是什么在控制循环
还有另一种方法可以得到结果,但有些人认为这是“糟糕的编码风格”;即一次分配和测试:
Comparable<?> result;
while ((result = tree.find(indexreg)) != null) {
//do stuff with variable "result"
}
可比结果;
而((result=tree.find(indexreg))!=null){
//使用变量“result”执行操作
}
有些人认为应该避免这种编码方式。我倾向于同意它们。可能indexreg为null,根本没有初始化。您当然应该像@Bohemian所建议的那样编写更具防御性的代码find(),但这可能是潜在的问题。或者参见下面的评论。我不认为问题与您的
可比性
有关
如果行while(tree.find(indexreg)!=null){
抛出一个NullPointerException
,则它必须,因为树为null
。没有其他可能性是可信的
- 使用
=
或!=
将对象引用与null
进行比较不会引发NPE。因此,即使tree.find(…)
返回了null
,也不能成为此异常的原因
- 将
null
值作为方法参数传递不会引发NPE。因此,如果indexreg
为null
,则不会导致此异常。(NPE可以由find
方法或它调用的东西抛出,但stacktrace不会在不同的方法中显示不同的行作为异常的起源。)
(我可能误解了这个问题。当OP说这行“导致”异常时,我假设OP的意思是“抛出”
不幸的是,OP只发布了代码片段,没有向我们展示stacktrace…这是一个关键的证据。)NPE抛出的确切行将是一个很好的信息,您是否确定tree
不是null
?另外,您还没有显示elementAt()的定义
,或者对于双参数版本的find()
。您的标题毫无意义。如果您真的检查null,您将不会得到异常。异常将被抛出,而不是返回。-1-这个问题不清楚,并且遗漏了关键信息。因此,答案(包括我的答案)只是猜测。由于OP没有向我们展示elementAt
的代码或两个参数find
,这个答案只不过是猜测而已。@Oli Charlesworth同意并进行了相应的投票和修正。在这种情况下,任何答案都是猜测。如果indexreg
为null
,则不会在t抛出异常他说OP说它被抛出了。(假设他所说的“原因”就是这个意思…)@Stephen C yep。在这个阶段,任何事情都是可能的:-是的,我的意思是该行抛出了异常。我的错。结果树为null,因为我忘记调用构造函数,所以它崩溃了。很抱歉没有发布更多代码,但我认为这与while条件中的某些语法错误有关。