Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:检查Comparable是否为null将返回NullPointerException_Java_Null_Nullpointerexception_Comparable - Fatal编程技术网

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条件中的某些语法错误有关。