Java Eclipse警告:不能为空?

Java Eclipse警告:不能为空?,java,eclipse,null,warnings,binary-search-tree,Java,Eclipse,Null,Warnings,Binary Search Tree,我在下面的代码中得到了我认为来自Eclipse的虚假警告,用于计算给定元素在二叉树中出现的次数: public int count(E item) { int count = 0; Node crnt = root; //First seek the item in the tree while (crnt != null) { int compare = crnt.data.compareTo(item); if (com

我在下面的代码中得到了我认为来自Eclipse的虚假警告,用于计算给定元素在二叉树中出现的次数:

public int count(E item)
{
    int count = 0;
    Node crnt = root;
    //First seek the item in the tree
    while (crnt != null)
    {
        int compare = crnt.data.compareTo(item);
        if (compare > 0)
            crnt = crnt.right;
        else if (compare < 0)
            crnt = crnt.left;
        else
        {
            //Shortcut if not allowing duplicate entries
            if (!allowDuplicates)
                return 1;
            count++;
            //Duplicates are always stored to the right
            while (crnt != null) // <--Warning appears here
            {
                crnt = crnt.right;
                if (crnt.data.compareTo(item) == 0)
                    count++;
                else
                    break;
            }
        }
    }
    return count;
}
公共整数计数(E项)
{
整数计数=0;
节点crnt=根;
//首先在树中查找项目
while(crnt!=null)
{
int compare=crnt.data.compareTo(项目);
如果(比较>0)
crnt=crnt.right;
否则如果(比较<0)
crnt=crnt.left;
其他的
{
//不允许重复条目时的快捷方式
如果(!allowDuplicates)
返回1;
计数++;
//副本始终存储在右侧

while(crnt!=null)/
crnt
仍将不同于
null
,因为它位于if-elseif-else语句的
else
子句中,可能会改变
crnt
。当它碰到第二个
while
语句时,它的值永远不会改变

它做的正是它应该做的:告诉您,
crnt
的值在该代码命中时永远不会为空,并且
while
中的附加检查是不必要的


David Wallace的Per avice:内部循环不可能为
null
,因为
crnt
对象在访问之前已经通过
int compare=crnt.data.compareTo(项)行进行了访问
,本质上构成了
crnt
不能为
null

crnt
的先决条件,但它仍然不同于
null
,因为它在if-elseif-else语句的
else
子句中,可能会更改
crnt
。当它点击时,它的值永远不会更改第二个
while
语句

它做的正是它应该做的:告诉您,
crnt
的值在该代码命中时永远不会为空,并且
while
中的附加检查是不必要的


David Wallace的Per avice:内部循环不可能为
null
,因为
crnt
对象在访问之前已经通过
int compare=crnt.data.compareTo(项)行进行了访问;
,基本上构成了一个先决条件,即
crnt
不得为
null

是,但在内部while循环中,
crnt
的值可以并且将发生变化-它是循环中的第一行。在第二个while循环完成之前,不会再次检查第一个while条件。是的,但如果它发生变化如果设置为null,则在执行
crnt.data.compareTo(项)操作时会出现null指针异常
。所以它不会是空的,并返回到
状态,而
状态。@Jeroen,如果你编辑你的答案来提到这一点,我会投票给你。@DavidWallace Ooh-很好的回答。它应该检查
crnt.right!=null
。果然,没有比较器行,警告消失了。这是真正的答案@DavidWallace:我编辑了我的答案以反映这一点。以后你可以自己做。我离开办公桌一段时间:)是的,那是一个真正的前额打击。我相信我会在尝试运行这段代码并从中获取空指针异常时就找到答案。事实上,我对Eclipse能够捕捉到这一未实现的错误印象深刻可访问的状态,虽然它没有解释它是如何不可访问的,但没有给人留下深刻的印象。永远不会猜到
compareTo()
作为罪魁祸首…是的,但是在内部while循环中,
crnt
的值可以并且将改变-它是循环中的第一行。第一个while条件在第二个while循环完成之前不会再次被检查。是的,但是如果它变为null,则在执行
crnt.data.com时会出现null指针异常帕累托(项目)
。所以它不会是空的,并返回到
状态,而
状态。@Jeroen,如果你编辑你的答案来提到这一点,我会投票给你。@DavidWallace Ooh-很好的回答。它应该检查
crnt.right!=null
。果然,没有比较器行,警告消失了。这是真正的答案@DavidWallace:我编辑了我的答案以反映这一点。以后你可以自己做。我离开办公桌一段时间:)是的,那是一个真正的前额打击。我相信我会在尝试运行这段代码并从中获取空指针异常时就找到答案。事实上,我对Eclipse能够捕捉到这一未实现的错误印象深刻可访问的状态,虽然没有解释它是如何无法访问的,但印象不深。永远不会猜到
compareTo()
是罪魁祸首。。。