嵌套对象null检查

时间:2018-06-11 15:12:42

标签: java spring-boot nullpointerexception

我知道如何检查NullPointerException的嵌套对象的方法很多,对于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个设置器可以用于50个excel单元,但有时会有5个或6个嵌套对象,这是一个真正的噩梦

可以说像setCell方法

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

我希望我的问题足够明确。请记住,我不能简单地更改嵌套对象,因为它的遗留代码和在很多地方使用!任何想法?

1 个答案:

答案 0 :(得分: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()));