Eclipse警告:不能为null?

时间:2013-11-19 02:05:37

标签: 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 (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;
}

(我可以向你展示Node类,但这并不奇怪。只是一个`E代表数据,两个Node指针代表左右儿童。)

我错过了什么,或者这是Eclipse中的错误?因为看起来它完全有可能,并且实际上期望 crnt在这种情况下可能为null,一旦它用完了正确的孩子。当然,它不会在第一次时间到达此循环时为空,但通常IDE足够智能以实现变量值在循环内的变化。然而,不是这个时候。 Eclipse建议我在此设置@SuppressWarnings("null"),或者我可以进入设置并完全关闭此警告,但我不认为它应该是必要的,我讨厌抑制或忽略它们可能存在的警告是有用的。

1 个答案:

答案 0 :(得分:4)

crnt仍然与null不同,因为它位于if-elseif-else语句的else子句中可能更改{{1} }}。当它到达第二个crnt语句时,它的值永远不会改变。

它完全按照它应该做的:告诉你while的值在该代码命中时永远不会为空,并且crnt中的额外检查是不必要的。

David Wallace的每个服务:内部循环不可能是while,因为null对象之前已经被行crnt访问过了,基本上形成了一个int compare = crnt.data.compareTo(item);不得为crnt的先决条件。