如何使用Optional校验嵌套对象链路空值 避免触发NullPointerException
问题原因
你原代码的NPE发生在Optional.ofNullable执行之前:model.getSomeField().getUserName()的调用过程中,model.getSomeField()返回null时直接调用getUserName()就会触发空指针,此时Optional还没完成初始化,自然无法做空校验。
解决方案
用Optional的map方法完成链式空校验,map会自动处理中间节点为空的场景,只要链路任意节点为null都会直接进入空Optional的流程,最后统一走orElse分支:
// 注意把ModelClass、SomeFieldClass替换成你实际的类名 return Optional.ofNullable(model) .map(ModelClass::getSomeField) .map(SomeFieldClass::getUserName) .orElse("No name");
如果能确定model本身一定不为null,也可以把第一行改成Optional.of(model),用ofNullable可以额外覆盖model本身为null的场景,容错性更高。
原理解释
- 每一步
map执行前都会先检查当前Optional持有的值是否为null,若为null会直接返回空Optional,不会执行传入的取值方法 - 整条链路只要任意一步取值为null,最终都会得到空Optional,触发
orElse返回默认值,不会抛出NPE
内容的提问来源于stack exchange,提问作者methodinvocation
相关产品推荐
相关产品推荐

