如何避免嵌套的空检查[重复]

Posted

技术标签:

【中文标题】如何避免嵌套的空检查[重复]【英文标题】:How to avoid nested null checks [duplicate] 【发布时间】:2020-04-01 15:26:39 【问题描述】:

在 java 中有一种方法可以避免在调用的每个级别上嵌套空值检查,以确保在此过程中没有空值阻止下一次调用。有没有优雅的方法来做到这一点?

例如:

objOne.objTwo.objThree.objFour.objFive

if(objOne.objTwo!=null)
    if(objOne.objTwo.objThree!=null)
      if(objOne.objTwo.objThree.objFour!=null)
            ...
   
  

【问题讨论】:

你知道Optional类吗? @Abra,Optional 在这种情况下如何提供帮助? 这个article 可能是相关的。 @Abra,这根本没有帮助。 Optional not 旨在替换 Java 中的每个非空条件。我想您可以从每个嵌套对象中创建一个Optional.ofNullable()。这会使代码更难理解。 Optional 是否有帮助是一个争论的问题。但它是唯一可以帮助...除了重新设计数据结构以消除空值作为可接受的值。 【参考方案1】:

反转它们。 (将Object 替换为实际类型。)

Object item1 = objOne.objTwo;
if (item1 == null)
   return; // continue if in a loop

Object item2 = item1.objThree;
if (item2 == null)
   return;

Object item3 = item2.objFour;
if (item3 == null)
   return;

// perform the action

这假设在您的示例结束后不需要进一步的操作。在这种情况下,您可能需要提取一个方法或进行一些其他修改,但目前没有给出这样的附加代码。

【讨论】:

这怎么算作倒置?流动没有倒置 @SharonBenAsher 取决于外部上下文,但是是的,只有在条件不成立时才会这样做。【参考方案2】:

您可以使用short circuit logic 将嵌套的 if 语句合并为一个。第一个假条件将退出 if 语句

if (objOne.objTwo != null && objOne.objTwo.objThree != null && objOne.objTwo.objThree.objFour != null) 
           ...

【讨论】:

以上是关于如何避免嵌套的空检查[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查bash中的空环境变量[重复]

避免在javascript中嵌套if [重复]

postgres - 避免创建重复的空列

如何避免我的 Firebase Cloud Function 中的嵌套承诺 [重复]

如何删除数组中的空元素[重复]

检查输入字段中的空值的正确方法是啥[重复]