在这种情况下,Eclipse的Java的空对象预测是错误的吗?



我的Eclipse Oxygen告诉我,这段代码的第7行有一个Potential null pointer access: The variable list may be null at this location。在我看来,listlist2都不可能为空。

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警告我是否有适当的理由。

是的,这是错误的。它不明白,您的初始list == list2提前回报与随后的XOR(^(支票的提前回报相结合,排除了它们中的任何一个null超过该点的可能性。


(如果你的普通维护程序员后来看了该代码,我也不会感到惊讶。

Eclipse被你棘手的代码弄糊涂了。 如果你这样写:

if (list == list2)
    return true;
if (list == null || list2 == null)
    return false;

然后Eclipse能够解决这个问题。 (我用Eclipse 4.7.1检查过...

问题是,当listlist2null时,list == null ^ list2 == null false。 这种情况在前面的if语句中处理过,但 Eclipse 的流分析无法推断出这一点。

在您的情况下,即使两个列表都为 null,方法也会返回 true,除非这对您来说是有效的方案。理想情况下,方法中的第一行应该是 null 检查。

if (list == null || list2 == null)
    return false;

相关内容

最新更新