检查null的最佳方法是什么?

时间:2017-04-27 11:50:06

标签: java

有人建议null使用 方法2 - 检查,但我不确定背后的原因是什么以及为什么应该首选?

Date test1 = null; // test1 can be any object like String instead of Date
if (test1 != null) {
  System.out.println("Test");
}

方法2: -

Date test1 = null;
if (null != test1) {
  System.out.println("Test");
}

3 个答案:

答案 0 :(得分:3)

Java 7引入了java.lang.Objects一些不错的辅助方法,例如requireNonNull()。 Java 8增加了一些,尤其是isNull()nonNull()。它们旨在用于stream()操作;但当然,他们并不局限于那种情况。

因此,一种替代选择就是依靠这些新方法来做出这样的决定。简洁,可读,“标准;并且阻止你在整个地方重复自己的检查。没有机会介绍和打字错误。当然,从另一个方法调用的开销很小。手上:如果你的方法被调用数百万次 - 无论如何都是JIT的;然后这些小方法可能很容易被内联。

答案 1 :(得分:2)

这里没有真正的区别。这两种情况都是一样的。讨论很可能来自我们写的Yoda conditions

 null          ==         temp1
literal    comparison    variable 

这可以防止我们错误地编写=(赋值运算符)而不是==(比较),当我们最终得到像if (foo = 42)这样的代码时,这些代码在某些语言中编译得很好逻辑错误可能很难找到(特别是新手程序员)。

但在你的情况下,你不需要使用那个结构。至少有两个原因:

  1. 您使用的是!=而不是==,因此您只能写=代替!=
  2. 的可能性很小
  3. 在Java if (expression)期望expression返回boolean值,所以即使你错误地写= null这样的代码也不会编译因为表达式将返回null。这使我们无法运行具有此类拼写错误的代码。

    Java中的Yoda条件仅对boolean这样的if (stop == true)表达式有意义,但即便如此,我们也应该跳过if (true == stop)(或== true而不是写==false。部分因为我们已经有了布尔值。因此,我们应该改为if (stop)if (!stop)

  4. 当您使用不同语言进行编程并希望通过使用一种有助于一种语言并且同时不会导致其他语言出现问题的风格时,使用这种风格是有意义的(即使它那里并不是真的有必要)。

    仍然值得了解构造/样式在哪里是有用的或必要的,以及它不在哪里,因为每种语言可能有更好的方式处理这个问题,如other answer Objects.nonNull中已经提到的那样。

答案 2 :(得分:-1)

这有几个合理的原因。第一个是来自C的保留。在C:

if(x = NULL) { ... }

...(注意单=)是一些开发人员可能不小心犯的错误。

if(NULL = x) { ... }

...导致编译器错误。因此,如果你习惯于先放null,那么犯这个错误就更难了。

然而此逻辑不适用于!=,因此继续将null放在首位的唯一原因是为了保持一致。

...并且在Java if(x = null)中也是编译器错误,因为Java不会将赋值计算为值。

另一种情况是将“预期”放在“实际”之前是常见的,那就是:

if("expected string".equals(string)) { ... }

由于"expected string"肯定不是null,因此NullPointerExceptionstring == null不能string.equals("expected string"),而if(x == null)则不会。{/ p>

因此,一些程序员养成了将预期值放在首位的习惯。

我自己的偏好是与英语句子类似的东西,对我来说:final在这方面更好。

我们过去常常捕捉小错误和拼写错误的一些技巧,通过单元测试习惯,首先避免空值以及明智地使用btnAssemblyLoad_Click变量来减少必要性。