我知道很多方法如何检查嵌套对象是否NullPointerException为Java,因为对于Java 8,最简单的方法是应用Optional<param>。或使用简单的if代码,例如
NullPointerException
Optional<param>
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 }
我希望我的问题很清楚。请记住,由于它的遗留代码并在很多地方都使用过,因此我不能简单地更改嵌套对象!有任何想法吗 ?
正如您在问题中提到自己时,请使用Optional,但是它比较宽松。
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()));