2011-06-05 74 views
-1

我有这个代码的一个大问题,我不知道如何使它:与的Java:检查是否可比不为空返回NullPointerException异常

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

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

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

它看起来在树中的对象,如果没有找到它(我不认为你可以返回一个空的可比对象返回null )。我试过谷歌搜索,但我没有找到有用的答案。有谁知道如何使这个代码工作?

+4

NPE被抛出的确切线将是一个很好的信息给 – 2011-06-05 02:30:52

+4

你确定那'树'不是'null'? – 2011-06-05 02:35:06

+3

另外,您还没有显示'elementAt()'的定义,或者'find()'的双参数版本的定义。 – 2011-06-05 02:36:54

回答

2

我不认为这个问题与你的Comparable有任何关系。

如果该行while(tree.find(indexreg) != null) {抛出一个NullPointerException,它必须因为treenull。没有其他可能性是可信的。一个对象引用的

  • 比较使用null==!=不会引发NPE。因此,即使tree.find(...)返回null,这不能成为此例外的原因。

  • 传递null作为方法参数的值不会抛出NPE。所以如果indexregnull,那不会导致这个异常。 (NPE 可能由find方法抛出或它调用的某个东西,但堆栈跟踪不会以与异常起源不同的方法显示不同的行。)


(我可能误解的问题。我假设OP的意思是“抛出”时,他说行了“原因”的例外。

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

+0

是的,我的意思是线条抛出异常。我的错。原来树是空的,因为我忘记调用构造函数,所以它崩溃了。对不起,不发布更多的代码,但我认为这是在while条件中的某些语法错误。 – Magnus 2011-06-05 20:51:59

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

FYI这相当于:

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

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

0

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

+2

或'tree'为空... – 2011-06-05 02:36:40

+1

由于OP没有向我们展示'elementAt'或两个参数'find'的代码,这个答案只不过是一个猜测... – 2011-06-05 02:38:15

+0

@Oli Charlesworth同意并且进行相应的修改和修改。在这种情况下,任何答案都是猜测。 – EJP 2011-06-05 02:43:14