我收到来自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用完了正确的子级,实际上期望@SuppressWarnings("null")可能为null。可以肯定的是,它第一次遇到该循环时不会为空,但是通常IDE足够聪明,可以意识到变量的值在循环内发生变化。但是这次不是。 Eclipse建议我对此输入,或者我可以进入设置并完全关闭该警告,但是我认为这不是必需的,并且我讨厌在可能有用的地方禁止或忽略警告。 最佳答案 crnt仍然与null不同,因为它位于if-elseif-else语句的else子句中,可能会更改crnt。命中第二个while语句时,它的值将永远不会改变。它完全按照应有的方式运行:告诉您,当代码到达时,crnt的值永远不会为null,并且不必要的while附加检查是。David Wallace的建议:内循环不可能为null,因为crnt对象已经在int compare = crnt.data.compareTo(item);行之前被访问过,从本质上构成了crnt不能为。关于java - Eclipse警告:不能为null?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20061775/
10-09 07:00