读取UBL XML时如何用更少的if判断避免空指针异常
减少空指针判断的实用方案
针对你这段嵌套多层空判断的代码,以下几种方法可以大幅简化逻辑并避免空指针异常:
1. 使用Java 8+的Optional类
Optional是Java 8引入的工具类,能优雅处理链式调用中的null,替代层层嵌套的if判断。通过map安全导航属性,ifPresent执行非空时的赋值逻辑:
Optional.ofNullable(despt.getDespatchSupplierParty()) .map(DespatchSupplierParty::getParty) .map(Party::getContact) .ifPresent(contact -> { Optional.ofNullable(contact.getTelephone()) .map(Telephone::getValue) .ifPresent(tfdesp000_arch::setDcpPartyContactTelephone); Optional.ofNullable(contact.getTelefax()) .map(Telefax::getValue) .ifPresent(tfdesp000_arch::setDcpPartyContactTelefax); Optional.ofNullable(contact.getElectronicMail()) .map(ElectronicMail::getValue) .ifPresent(tfdesp000_arch::setDspPartyContactElectronicMail); Optional.ofNullable(contact.getName()) .map(Name::getValue) .ifPresent(tfdesp000_arch::setDspContactName); });
这段代码用一层Optional链式判断替代了外层嵌套if,内部属性的空判断也通过Optional简化,逻辑更流畅,可读性更强。
2. 提前抽取变量,减少重复调用
如果不想引入Optional,可以先把链式调用中的对象逐层抽取为变量,避免重复调用方法,同时简化外层嵌套:
DespatchSupplierParty supplierParty = despt.getDespatchSupplierParty(); if (supplierParty == null) { return; } Party party = supplierParty.getParty(); if (party == null) { return; } Contact contact = party.getContact(); if (contact == null) { return; } // 后续直接使用contact对象判断属性 if (contact.getTelephone() != null) { tfdesp000_arch.setDcpPartyContactTelephone(contact.getTelephone().getValue()); } if (contact.getTelefax() != null) { tfdesp000_arch.setDcpPartyContactTelefax(contact.getTelefax().getValue()); } if (contact.getElectronicMail() != null) { tfdesp000_arch.setDspPartyContactElectronicMail(contact.getElectronicMail().getValue()); } if (contact.getName() != null) { tfdesp000_arch.setDspContactName(contact.getName().getValue()); }
通过线性的空判断抽取变量,把多层嵌套改成顺序判断,代码更直观,也减少了重复的方法调用开销。
3. 采用空对象模式(Null Object Pattern)
从根源上避免null的出现:修改实体类,让getDespatchSupplierParty()、getParty()、getContact()等方法在无数据时返回对应类型的空对象,而非null。空对象的属性方法返回默认值或空对象,这样无需任何空判断即可安全调用链式方法。
比如定义空Contact实现:
public class NullContact extends Contact { @Override public Telephone getTelephone() { return new NullTelephone(); } @Override public Telefax getTelefax() { return new NullTelefax(); } @Override public ElectronicMail getElectronicMail() { return new NullElectronicMail(); } @Override public Name getName() { return new NullName(); } }
对应的NullTelephone类的getValue()返回空字符串或默认值:
public class NullTelephone extends Telephone { @Override public String getValue() { return ""; // 或业务允许的默认值 } }
之后在Party类的getContact()方法中,当没有联系人时返回new NullContact()而非null,这样直接调用赋值逻辑即可:
tfdesp000_arch.setDcpPartyContactTelephone( despt.getDespatchSupplierParty().getParty().getContact().getTelephone().getValue() );
这种方案适合长期维护的项目,彻底消除空指针隐患,但需要修改现有实体类的实现逻辑。
内容的提问来源于stack exchange,提问作者neylersin
相关产品推荐
相关产品推荐

