有没有?.运算符来执行 Java 执行空指针检查?

2022-09-04 02:23:58

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

我必须这样做

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

有点像这个...

有没有像?(这是C#的一部分)对于Java来说缩短了负担?

示例:

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

答案 1

与Java中的大多数事情一样,你必须以冗长的方式去做。嘿,至少它更具可读性 - 如果你必须做一个空检查,为什么不让它明确和容易看到(在这里扮演魔鬼的倡导者)


答案 2

没有?在Java中,所以,正如Hari所指出的那样,你必须以“冗长”的方式做事。但是,有人可能会说这是一件好事,因为它不鼓励使用nulls。

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

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

PHP做出了一个可怕的设计选择。与做一些荒谬的事情相比,中止错误要好得多。

相反,你应该问这样的问题:

  1. 对于 a 为空意味着什么?这是编程错误吗?如果是这样,请抛出一些运行时异常/非法参数异常。如果这是关键代码,并且您“不能失败”,至少要记录您正在掩盖可疑的内容,因此也许它会得到修复。
  2. 如果 a.child.getValue() 本身返回 null 怎么办?我的调用方将如何区分该 null 和 “a 或子项为 null” null?他们不能
  3. 如果存在良好的默认值,请使用它。如果您使用的是集合或数组,请不要将 null 传递给“空”。传递一个 ,例如一个 emptyList 或一个空数组。请考虑将其设置为空字符串,而不是将字符串设置为 null。顺便说一句,这让你更简单!Collections.emptyXXX()""hashCode(), equals(), and compareTo()
  4. 使用空对象模式。如果 a 是 Foo 的一个实例,定义一个静态的最终 Foo.NULL,它确实有一个子节点,其值本身就是“nullish” - null 或 “”。

有时你真的做不到这些事情。参数为 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()