You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:02:48