检查null - 什么顺序?

时间:2012-06-11 15:55:31

标签: java

检查空值时,我使用:

String str;

if(str == null){
    //...
}

但我也见过这个:

if(null == str){
    //...
}

使用其中一个是否有任何优势?或者只是为了提高可读性?

7 个答案:

答案 0 :(得分:32)

null == x约定通常在熟悉C的人编写的代码中找到,其中赋值也可以是表达式。一些C程序员编写这样的代码,这样如果他们错过

中的=
if (NULL == ptr)...

代码无法编译,因为NULL = ptr不是有效的分配。这可以防止在代码库中引入相当狡猾的错误,尽管现代C编译器会使这些约定变得过时,只要一个人注意启用并读取生成的警告......

这种编码风格在Java中从未有过任何用处,其中引用赋值不能用作布尔表达式。它甚至可以被认为是反直觉的;在他们的自然语言中,大多数人会说“如果X为空......”,或者“如果X等于17 ......”,而不是 “如果null等于X ......”

答案 1 :(得分:30)

第二个版本(null == str)称为 yoda条件

它们都会产生相同的行为,但第二个有一个优点:当您忘记一个=时,它会阻止您意外更改变量。在这种情况下,编译器会在该行返回一个错误,并且您没有留下代码的奇怪行为以及由此产生的调试。

答案 2 :(得分:4)

除了可读性之外,两者之间没有区别。使用对你更有意义的。

答案 3 :(得分:3)

正如您所说,可读性是最重要的原因。大声读出来,(null == str)读得不好。这几乎就像从右到左阅读。 (str == null)读得更好。

此外,我认为需要考虑以下因素:

if (str != null)  
if (str == null)

VS

if (null != str)
if (null == str)

我希望正(str == null)和负数以相同的方式写,这是我赞成顶集的另一个原因。

答案 4 :(得分:2)

if (null == str) {
}

是来自c / c ++的编程习惯用法,其中赋值运算符=可用于解析为true / false语句。例如在c中,如果你想检查我是否可以用c / c ++打开一个流,你可以

if (myStream = openStream())

将打开并分配一行。但是,这意味着人们通常会在=表示==时输入if (x = 5),并且它将是c中的有效语法:例如if (x ==5)将永远解析为true,当它们真正意味着{{ 1}}。所以人们写if (5 == x)所以如果你遗漏了=,你的代码将无法编译。

这不适用于java。

答案 5 :(得分:2)

没有真正的区别。然而,第二个被认为不易出错。在第一种情况下,如果您尝试

,则不会出现错误
String str;

if(str = null){
}

这是你在条件句中通常不做的事情。

另外,你首先要考虑实际情况,这是一个很好的做法。

答案 6 :(得分:1)

if(a==b) {}if(b==a) {}相同,如果b为null,则同样如此。就功能而言,它只是一种样式/顺序差异,至少在java中是这样。