在这种情况下,Eclipse 的 Java 的空对象预测是否错误?
Is Eclipse's Java's null object prediction wrong in this case?
我的 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 是否有适当的理由警告我。
是的,打错了。它不明白你的初始 list == list2
早期 return 与你随后的异或(^
)检查的早期 return 的组合排除了它们中任何一个的可能性 null
超过那个点。
(如果您的普通维护程序员后来查看该代码时也被它绊倒,我不会感到惊讶。)
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的流分析无法推导出。
在您的情况下,即使两个列表都为空,方法也会 return 为真,除非这对您来说是有效的情况。理想情况下,方法中的第一行应该是空检查。
if (list == null || list2 == null)
return false;
我的 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 是否有适当的理由警告我。
是的,打错了。它不明白你的初始 list == list2
早期 return 与你随后的异或(^
)检查的早期 return 的组合排除了它们中任何一个的可能性 null
超过那个点。
(如果您的普通维护程序员后来查看该代码时也被它绊倒,我不会感到惊讶。)
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的流分析无法推导出。
在您的情况下,即使两个列表都为空,方法也会 return 为真,除非这对您来说是有效的情况。理想情况下,方法中的第一行应该是空检查。
if (list == null || list2 == null)
return false;