一尘不染

嵌套对象空检查

spring-boot

我知道很多方法如何检查嵌套对象是否NullPointerException为Java,因为对于Java
8,最简单的方法是应用Optional<param>。或使用简单的if代码,例如

if(foo.bar() != null && foo.getBar().getObject()!=null){
    foo.getBar().getObject().getWhatever();
}

好吧,我的问题是,在不知道内部类/方法名称的情况下,是否有一种简单的方法可以做到这一点

更清楚地说,我有这样的代码

contract.getContactInfo().getPosition()
contract.getEntitledPerson().getEmail()

我想做一个这样的例子

excel.setCell(name1,contract.getContactInfo().getPosition());
excel.setCell(name2,contract.getEntitledPerson().getEmail());

如果它仅适用于2个嵌套对象或仅2个setter,但对于50个excel单元格(有时带有5或6个嵌套对象)却能做到,那真是一场噩梦

就像setCell方法一样

public setCell(String name,Object object){
     return object; // make sure no nested object is null
}

我希望我的问题很清楚。请记住,由于它的遗留代码并在很多地方都使用过,因此我不能简单地更改嵌套对象!有任何想法吗 ?


阅读 441

收藏
2020-05-30

共1个答案

一尘不染

正如您在问题中提到自己时,请使用Optional,但是它比较宽松。

excel.setCell(name1, Optional.of(contract).map(Contract::getContactInfo).map(ContactInfo::getPosition).orElse(null));
excel.setCell(name2, Optional.of(contract).map(Contract::getEntitledPerson).map(Person::getEmail).orElse(null));

像这样格式化时更容易阅读:

excel.setCell(name1, Optional.of(contract)
                             .map(Contract::getContactInfo)
                             .map(ContactInfo::getPosition)
                             .orElse(null));
excel.setCell(name2, Optional.of(contract)
                             .map(Contract::getEntitledPerson)
                             .map(Person::getEmail)
                             .orElse(null));

如果您的目标是最小的代码,则只需捕获即可NullPointerException。在我看来,这有点骇人听闻,但是可以解决问题。

首先,一个辅助方法:

public static <T> T nullGuard(Supplier<T> supplier) {
    try {
        return supplier.get();
    } catch (@SuppressWarnings("unused") NullPointerException ignored) {
        return null;
    }
}

然后包装有问题的表达式:

excel.setCell(name1, nullGuard(() -> contract.getContactInfo().getPosition()));
excel.setCell(name2, nullGuard(() -> contract.getEntitledPerson().getEmail()));
2020-05-30