我在以下代码中得到了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")
,或者我可以进入设置并完全关闭此警告,但我不认为它应该是必要的,我讨厌抑制或忽略它们可能存在的警告是有用的。
答案 0 :(得分:4)
crnt
仍然与null
不同,因为它位于if-elseif-else语句的else
子句中可能更改{{1} }}。当它到达第二个crnt
语句时,它的值永远不会改变。
它完全按照它应该做的:告诉你while
的值在该代码命中时永远不会为空,并且crnt
中的额外检查是不必要的。
David Wallace的每个服务:内部循环不可能是while
,因为null
对象之前已经被行crnt
访问过了,基本上形成了一个int compare = crnt.data.compareTo(item);
不得为crnt
的先决条件。