java - 嵌套对象空值检查

标签 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 个 setter,那很好,但如果它用于 50 个 Excel 单元格,有时有 5 或 6 个嵌套对象,那么这样做真是一场噩梦

比如 setCell 方法

public setCell(String name,Object object){
     return object; // make sure no nested object is 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));

采用如下格式更容易阅读:

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()));

关于java - 嵌套对象空值检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800955/

相关文章:

java - 如何在 JUnit 测试中模拟 Camel 处理器

java - 使用 Java 打印 HTML 文件,无需打印对话框

java - 使用 RestTemplate 调用 API 时如何捕获超时异常

java - 为 SendGrid 创建 JUnit 测试

android - 带抽屉导航的 PreferenceActivity 抛出空指针异常

java - 由 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5 产生的 NullPointerException

android - 从另一个类调用方法时获取 null?

java - 如何使用 iText PDF Java 库打开远程目录?

java - Java中的条码图像生成器

java - Thymeleaf EL 表达式生成链接为/?param=value 而不是/value