【问题标题】:Is Eclipse's Java's null object prediction wrong in this case?在这种情况下,Eclipse 的 Java 的空对象预测是否错误?
【发布时间】:2018-09-16 12:54:57
【问题描述】:

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

【问题讨论】:

  • 您正在编写一段有点奇怪的代码(我的意思是 XOR),所以我想它可能会被混淆。只需使用 OR,它仍然可以工作。
  • @FedericoklezCulloca 感谢您指出这一点。很明显,使用 OR 而不是 XOR 将继续工作,并且我已经测试过 Eclipse 正确地停止预测可能的空指针。也许我的问题还不清楚。我不是在问如何让 Eclipse 停止警告我,但如果有适当的理由让 Eclipse 警告我。
  • 您是否有任何理由使用 XOR 运算符 ^ 而不是标准或 ||?由于短路,默认值更易于阅读并且性能更好。

标签: java eclipse null-pointer


【解决方案1】:

是的,这是错误的。您最初的 list == list2 早期返回与您随后的 XOR (^) 检查的早期返回相结合,这并不意味着它们中的任何一个都排除了 null 超出该点的可能性。


(如果您的普通维护程序员后来在查看该代码时也会绊倒它,我不会感到惊讶。)

【讨论】:

    【解决方案2】:

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

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

    然后 Eclipse 能够解决它。 (我检查了 Eclipse 4.7.1 ...)

    问题是当listlist2 都是nulllist == null ^ list2 == nullfalse。这种情况在前面的if 语句中已经处理过了,但是Eclipse 的流分析不能推导出来。

    【讨论】:

    • 我希望是这样(它可以理解||)。没有方便检查的 Eclipse(我不使用 Eclipse)。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2015-08-10
      • 2017-02-01
      • 2020-08-22
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多