我的Eclipse Oxygen告诉我,此代码的第7行有一个Potential null pointer access: The variable list may be null at this location
。
在我看来,list
或list2
都无法为空。
public static <T> boolean equalsLists(List<T> list, List<T> list2, Equals<T> equals)
{
if (list == list2)
return true;
if (list == null ^ list2 == null)
return false;
if (list.size() != list2.size()) //here eclipse highlights a Potential null pointer access for both list and list2
return false;
for (int i = 0; i < list.size(); i ++)
if (equals == null && !equals(list.get(i), list2.get(i)) || equals != null && !equals.equals(list.get(i), list2.get(i)))
return false;
return true;
}
编辑:正如我在回答评论的评论中写的那样,很明显使用OR而不是XOR将继续工作,并且我已经测试过Eclipse正确地停止预测可能的空指针。
也许我的问题并不清楚。我不是问如何让Eclipse停止警告我,但是如果有正确的理由让Eclipse警告我。
答案 0 :(得分:3)
是的,这是错误的。我们还没有理解,您的初始list == list2
早期返回与您之后的XOR(^
)检查的早期返回的组合排除了它们中任何一个的可能性{{1超越那一点。
(如果您的普通维护程序员稍后查看该代码,我也不会感到惊讶。)
答案 1 :(得分:2)
Eclipse被棘手的代码搞糊涂了。如果你这样写:
if (list == list2)
return true;
if (list == null || list2 == null)
return false;
然后Eclipse能够解决它。 (我查看了Eclipse 4.7.1 ...)
当list == null ^ list2 == null
和false
都是list
时,问题是list2
为null
。这个案例在之前的if
语句中处理,但Eclipse的流分析无法推断出这一点。
答案 2 :(得分:0)
在你的情况下,即使两个列表都为空,方法也会返回true,除非这对你来说是有效的方案。理想情况下,方法中的第一行应该是空检查。
if (list == null || list2 == null)
return false;