有没有 ?。 Java的运算符执行空指针检查?

时间:2014-11-22 05:41:16

标签: java nullpointerexception null-check

当我编码时,我对空检查感到沮丧。特别是在编码数据结构时!

我必须这样做

String val;
if(a != null && a.child != null)
    val = a.child.getValue();
else
    val = null;

有点像......

是否有类似的运营商? (这是C#的一部分),Java可以缩短负担吗?

С#example:

String val = a?.child?.getValue();

6 个答案:

答案 0 :(得分:6)

没有

与Java中的大多数事情一样,您必须以漫长的方式进行。嘿,至少它更具可读性 - 如果你必须进行空检查,为什么不明确并且容易看到它(在这里扮演魔鬼的拥护者)

答案 1 :(得分:2)

?.运算符在Java中不存在。

"大多数"紧凑,你可以做的是?:三元运算符,你可以"链":

String val = a != null && a.child != null ? a.child.getValue() : null;

String val = a == null ? null : a.child == null ? null : a.child.getValue();

答案 2 :(得分:2)

没有? Java中的操作符,因此,正如Hari所说,你必须做的事情是长期啰嗦"办法。但是,有人可能会认为这是的事情,因为它不鼓励使用空值。

例如,在OP的代码中,如果一个或它的孩子不存在,为什么要将val设置为null?让我们假设这是一个函数,并返回val。这是一个代码味道:它只是向代码用户推送了另一个空检查的要求。它变成了无限循环的空检查,完全混乱了代码并混淆了逻辑,因为维护程序员通常无法判断这是否是合法的逻辑,或者偏执的前程序员正在悄悄地忽略错误。 Don't mimic PHP!。引用那种出色的咆哮:

"当面对无意义的事情或因错误而中止时,它(PHP)会做一些荒谬的事情。"

PHP做出了糟糕的设计选择。 使用错误中止比使用无意义的内容要好得多。

相反,你应该问类似的问题:

  1. a为空是什么意思?这是编程错误吗?如果是这样,抛出一些RuntimeException / IllegalArgumentException。如果这是关键代码并且你不能失败",至少记录你正在报道一些可疑的东西,所以它可能会得到修复。
  2. 如果a.child.getValue()本身返回null怎么办?我的调用者将如何区分该null和" a或child为null"空值? 他们无法
  3. 如果有一个好的默认值,请使用它。如果您使用的是Collection或Array,不会将null传递给" empty" 。通过Collections.emptyXXX(),例如an emptyList或空数组。不要将String设置为null,而应考虑将其设置为空字符串""。顺便说一句,这使你的hashCode(), equals(), and compareTo()更加简单!
  4. 使用Null Object Pattern.。如果a是Foo的一个实例,那么定义一个静态的最终Foo.NULL,它有一个孩子,其值本身就是" nullish" - null或""。
  5. 有时你真的不能做这些事情。参数为null的正确理由,或者您必须允许向后兼容先前的错误设计或第三方库。 IMO,这应该是罕见的,你应该记录发生的事情。也许你应该返回null(或0)以外的东西来反映这一点。例如

    /**
       countPeople
       @param  node  null means the foobar can't connect to the database, 
       @return       Foobar.ERR_NO_DB if node is null
    */
    

    在OP的例子中,它看起来可能是某种XML节点,Java XML接口非常庞大,为其中一个创建一个好的NULL对象将是一项艰巨的任务。 (嗯,也许是一个很好的小开源项目?)。但是,在这种情况下,您可能会多次调用a.child.getValue()。编写一个小实用程序函数来处理它并处理空值。而不是在任何地方进行冗长的空检查,至少它们被封装在一些实用方法中。干。并且,可以说这些检查是冗长的,鼓励你做一个更好的设计。那么缺乏?操作员是件好事,对吧? : - )

答案 3 :(得分:1)

Java中没有这样的运算符。我能想到的最接近的东西是Yoda conditions,它允许你检查一个常量的值,如

if ("test".equals(str))

而不是

if (str != null && str.equals("test"))

答案 4 :(得分:1)

不,没有? JAVA的运营商。您可以使用!=运算符来检查非空

String val = (a != null && a.child !== null) ? a.child.getValue() : null; 

答案 5 :(得分:0)

Java中没有这样的运算符。

 str != null && str.equals("test")