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

时间:2018-04-06 13:18:36

标签: java eclipse null-pointer

我的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警告我。

3 个答案:

答案 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 == nullfalse都是list时,问题是list2null。这个案例在之前的if语句中处理,但Eclipse的流分析无法推断出这一点。

答案 2 :(得分:0)

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

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