为什么null == null没有警告?

8

Eclipse在比较两个相同的表达式时会显示警告:

if (1 == 1) -> warning
if (a == a) -> warning

然而,对于 null == null (尽管 null == null 总是成立),不会显示任何警告:
if (null == null) -> no warning

这是有什么原因吗?

4
null 总是 null,但由于 null 标识着一个不存在的对象(尽管如此,仍然是一个对象),因此仍需要进行比较。 - Laurens
1
@Laurens 但是,为什么a==a会有警告?(a是一个空对象) - merours
是因为 a1 有状态而 null 是状态的缺失吗? - Yassin Hajaj
你是否正在寻找一个对那段代码非常熟悉并且能够给出权威答案的人? - Erick G. Hagstrom
1
@fxm 在某种程度上是一个常量,但是这个常量指向的是一个不存在的内存块。 - Laurens
显示剩余5条评论
2个回答

3

考虑一下这个警告条件试图防止什么。它的目的是警告您,您没有比较您打算比较的两个变量,例如由于拼写错误(例如foo == foo,当您想说的是foo == boofoo == fpp),或者两个字面值(例如1 == 1)。

(当然,比较两个字面值会出现不同的问题-结果总是相同的,在代码中应该简化为truefalse。)

null == null不是潜在问题的情况。如果您将变量命名为类似于“null”的名称,然后错误地写入“null”,那么您就有了一个完全不同的问题,编译器无法猜测。


1

对于像 int char 这样的原始类型,编译器已知其值。您可以将它们进行比较,如果它们相同,便会立即引发警告。

例如:

'A' == 'A'

甚至是:

或者:

'A' == 97

对于对象,其值编译器尚不知晓。它还没有在内存中分配空间以存储该值。即使是空引用,也需要在运行时检查对该值的引用。
例如:
null == null

或者

"abc" == "abc"

然而,如果您将一个对象与自身进行比较,您将会收到一个警告。这是因为您已经明确地定义了该对象,因此编译器知道它是相同的,无需检查其值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接