如何检查 Java 中的属性(对象)是否为空

How check if an Attribute(object) is null in Java

我需要一个报告的特定数据,然后我从父对象获取所有信息

Object1

它有很多属性,对象属性

Object11, Object12, Object13, attr1, attr2...

属性也有很多属性

Object111, Object131, Object132,..

至此我得到了5个等级的数据属性

当我向我的报告发送信息时,它说,错误:cause:null

object1.getIdObject11().getIdObject111().getDescription;

因为 Object111 为空,所以报错

我尝试使用

object1.getIdObject11().getIdObject111().getDescription==null?'':object1.getIdObject11().getIdObject111().getDescription;

但它只验证描述是否为空,并抛出相同的错误 然后我尝试验证 Object

if(object1.getIdObject11().getIdObject111() == null) {
    var = object1.getIdObject11().getIdObject111().getDescription;
} else {
    var = "";
}

但是当 Object11 为 null 时,它会抛出同样的错误。

我认为对每个属性执行此操作不是一个好方法(必须获得大约 30 个属性)

if(object1.getIdObject11()!=null) {
    if(object1.getIdObject11().getIdObject111()!=null) {
        if(object1.getIdObject11().getIdObject111().getIdObject1111()!=null) {
             //...
         }
    }
}

我想验证是否有一个空对象,如果是则设置''(空白),没有这么大的代码(因为得到的参数是在报告中设置的,与字母混合)。

reportline1 = "Area: "+object1.getIdObject11().getIdObject111().getName;

我可能会这样做以在将来轻松扩展代码的功能的方式可能需要在开始时编写一些内容,但将永远轻松使用。

我会在你的父 class 中创建一个名为 hasNull 的新方法 returns 一个 boolean 就像这样:

public boolean hasNull()
{
    boolean hasANull = false;

    //Call another hasNull() inside of object11 which in turns calls hasNull() in object111 etc.

    //If any of the calls return with a true/null value set hasANull to true
    return hasANull;  
}

这反过来检查它包含的当前对象是否是 null。如果 class 变量之一是您创建的另一个自定义 class,则您可以将另一个 hasNull 添加到该变量中并继续,直到到达可以执行特定操作的最低级别当值为null时比如设置为"".

实施此功能后,您将能够在需要时随时使用它:

if (!object1.hasNull())
{
//Do whatever you want if there are no null values
}
else
{
//Do whatever you want if there is a null value
}

如果您只希望它切换最低级别的值,并且在这两种情况下都不需要执行任何操作,您也可以将其设为 void 方法。

您的代码中断 Demeter's law。这就是为什么最好重构设计本身。 作为解决方法,您可以使用 Optional

   var = Optional.ofNullable(object1)
    .map(o -> o.getIdObject11())
    .map(o -> o.getIdObject111())
    .map(o -> o.getDescription())
    .orElse("")

我更喜欢给 dehasi 的解决方案。

但你也可以这样做:

getOrElse(() -> object1.getIdObject11().getIdObject111().getDescription(), "")

其中 getOrElse 是:

public static <T> T getOrElse(Supplier<T> getter, T elseValue) {
    try {
        return getter.get();
    } catch (Exception e) {
        // log or do something with it
    }
    return elseValue;
}

这可能会引起争议,因为您使用 Exception 来执行此操作。