检查空 – 什么命令?

检查空值时,我使用这个:

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

但我也看到了这一点:

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

使用其中一个有什么优势? 还是仅仅为了提高可读性?

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

它们都导致相同的行为,但第二个有一个优点:当你忘记一个=时,它可以防止你意外地改变一个variables。 在这种情况下,编译器会在该行返回一个错误,而且不会留下一些奇怪的代码行为和debugging结果。

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

 if (NULL == ptr)... 

代码不会编译,因为NULL = ptr不是一个有效的赋值。 这可以防止在代码库中引入一个相当狡猾的错误,尽pipe现代的C编译器会使这样的约定过时,只要注意启用并读取生成的警告即可。

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

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

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

另外,我认为还需要考虑以下几点:

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

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

我期望正面的(str == null)和负面的都是以同样的方式写的,这也是我赞成最上面那组的另一个原因。

 if (null == str) { } 

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

 if (myStream = openStream()) 

哪些设置打开并分配在一行中。 然而,这意味着人们通常在input=时意味着== ,并且它在c中是有效的语法,例如, if (x = 5)总是会parsing为真,那么它们的意思是if (x ==5) 。 所以人们写if (5 == x)所以如果你遗漏了一个=你的代码将不会编译。

这不适用于Java。

没有真正的区别。 然而,第二个被认为不太容易出错。 在第一种情况下,如果您尝试这样做,您不会得到错误

 String str; if(str = null){ } 

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

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

if(a==b) {}if(b==a) {}相同,并且如果b为null,则同样如此。 就function而言,这只是一种风格/顺序差异,至less在java中。

一些开发人员认为var == nullnull == var更容易出错。 他们的观点是,你可能会不小心分配variables而不是进行空值检查。

但是只有当你testingnull的variables是一个Boolean你可能会意外地使用=而不是==来编译它。

 Boolean checked = Boolean.TRUE; if(checked = null){ // accidentally assigned null and compiles } 

只有在这种情况下,分配才能编译,因为条件expression式必须求值为一个布尔值。 参见JLS-14.9。 由于赋值expression式本身的计算结果是一个布尔types,因此它会进行编译。 但是你将会在runtume上得到一个NullPointerException ,因为java会试图取消被checkedvariables的值为null

如果你使用任何其他types,那么你会得到一个编译器错误。 例如

 String str = "hello"; if(str = null){ // compiler error, because str = null doesn't evaluate to a boolean } 

我的结论是,错误情况极其罕见,您可以轻松编写检测这些错误的unit testing。

所以,以更可读性的方式编写if语句。

我认为“ 如果名称为空 ”更有意义,那么“ 如果空名称 ”。