为什么要使用"null != anything"而不是"anything!=null"?

4

我看到过许多前辈的代码,他们在许多地方都使用了这个语句。它有什么影响?为什么他们不能包括 anything != null。下面这件事也是如此:

"true".equals(x)

为什么会这样呢?


3
这是您正在寻找的吗?https://dev59.com/XnE95IYBdhLWcg3wSsGD - Luiggi Mendoza
6个回答

9

anything != nullnull != anything完全等价。

另一方面,使用"true".equals(x)可以避免在执行x.equals("true")时检查x是否为null。


2

将常量放在等式表达式的左侧是为了避免NullPointerException,即使变量为null。这也提高了表达式的可读性。

话虽如此,null!=something是个人选择,我更喜欢使用something!=null


2

这是两种不同的实践方法。

在与 null 进行比较时,使用左侧的 null 可以确保您不会错误地使用 = 而不是 ==。然而,这是从其他语言中借鉴来的做法,在 Java 中,表达式

if ( something = null ) 

由于没有解析为布尔值,该操作将会失败。在其他语言中,使用实际上是指针的值作为条件可能是可允许的。

因此,在Java中这种做法是毫无意义的。


如你所说,第二个做法是为了防止NullPointerException。需要注意的是,这种做法是有争议的,因为它允许null传播到程序的后面,通常这意味着当null引起错误时,它将更难被发现。


1
那个检查是为了确保程序在读取变量之前已经初始化它。如果程序试图访问空变量,它将会崩溃(在Java中特别是抛出一个NullPointerException)。这是防御性编程的关键方面。
至于顺序,判断某物是否为空是可交换的。也就是说:
something != null

是同样的意思

null != something

这完全是个人喜好的问题。正如@manouti在上面解释的那样,"true".equals(x)避免了在执行x.equals("true")时检查x是否为null的需要,因此你可以节省一行代码。

"这个检查是为了确保程序在读取变量之前已经对其进行了初始化。" 变量如何通过改变“equals”的操作数顺序自动初始化?不,我没有投票否决你的答案,如果你在想。 - Chetan Kinger
看起来我误解了问题。我以为他想知道 null 是什么... - Lawrence Aiello
@Lawrenece 程序员并不总是在同一页面上。您始终可以编辑您的答案。 - Chetan Kinger
我总是有疑虑,因为我不想让它看起来像是我在抄袭答案。谢谢 :) - Lawrence Aiello
如果你知道答案但只是误解了问题,那就不算是抄袭。此外,其他用户可能会在某一天看到你的答案并决定将其投票降低。这样会损失你辛苦赚来的声望值。 - Chetan Kinger

1
这被称为 Yoda条件。除其他外,它有助于防止由于缺少=!而导致的意外赋值,例如foo = null。相反,null = foo甚至不能编译。
话虽如此,这纯粹是一种风格上的偏好。 foo != null在逻辑上等同于null != foo

1
如果将 foo = null 用于 if/while 语句内部或分配给 boolean 变量,它也无法编译。 - Tagir Valeev

0

似乎有些人更喜欢使用 null != anything,因为 anything 可能是一个相当长的表达式,所以先写 null 可以在窄窗口中使其可见,并简化代码阅读(“好的,我们只是检查某个东西不是 null”)。但这完全是一种风格问题。

至于 "true".equals(x),@manouti 已经很好地解释了。


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