18

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

String str;

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

但我也看到了这个:

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

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

4

8 回答 8

38

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

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

于 2012-06-11T16:01:03.613 回答
34

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

if (NULL == ptr)...

代码不会编译,因为NULL = ptr它不是一个有效的赋值。这可以防止在代码库中引入相当隐蔽的错误,尽管现代 C 编译器使此类约定过时,只要注意启用和阅读生成的警告...

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

于 2012-06-11T16:00:27.393 回答
4

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

于 2012-06-11T15:56:41.647 回答
3

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

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

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

对比

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

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

于 2012-06-11T16:00:03.657 回答
2

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

于 2012-06-11T16:00:42.370 回答
2
if (null == str) {
}

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

if (myStream = openStream())

在一行中设置打开和分配。然而,这意味着人们经常=在他们的意思是 时键入==,这将是 c 中的有效语法:例如if (x = 5),当他们真正的意思时,总是会解析为 true if (x ==5)。因此,人们会这样写if (5 == x),如果您遗漏 a,=您的代码将无法编译。

这不适用于java。

于 2012-06-11T16:01:48.890 回答
2

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

String str;

if(str = null){
}

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

此外,您可以先考虑实际情况,这是一个很好的做法。

于 2012-06-11T16:08:40.393 回答
1

一些开发人员认为这var == nullnull == var. 他们的论点是您可能不小心分配了变量而不是进行空检查。

但只有当您测试的变量null是 a时Boolean,您可能会意外地使用=而不是,==它才会编译。

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

只有在这种情况下,赋值才能编译,因为条件表达式必须计算为布尔值。见JLS-14.9。由于赋值表达式本身的计算结果为布尔类型,因此它可以编译。但是你会得到一个NullPointerExceptionat runtume,因为 java 会尝试解开checked变量null.

如果您使用任何其他类型,那么Boolean您将收到编译器错误。例如

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

我的结论是错误情况极为罕见,您可以轻松编写检测此类错误的单元测试。

因此,以更具可读性的方式编写 if 语句。

我认为“ if name is null ”比“ if null is name ”更有意义。

于 2015-09-11T05:44:47.087 回答