如何用Java 11 Optional通过函数链避免空指针异常?
问题分析与解决建议
测试代码抛NPE的原因
你写的代码里,Optional.ofNullable(x.toString().toLowerCase()) 是先执行 x.toString() 再把结果传给 ofNullable。但x是null,调用toString()直接触发空指针异常,这时候Optional还没开始工作,自然无法帮你避免NPE。
测试代码的正确写法
把null变量先包裹进Optional,再用map处理后续调用:
@Test public void optionalsWorkingAsExpected() { String x = null; var y = Optional.ofNullable(x) .map(String::toString) .map(String::toLowerCase) .orElse(null); assertThat(y).isNull(); }
map方法会先检查Optional内部是否有值,只有非null时才执行传入的函数,否则直接跳过,不会触发NPE。
链式调用的解决方案
针对你的实际需求myClass.getMyData().transformData().getName(),需要从最上游的对象开始,用Optional逐层包裹并调用方法:
String name = Optional.ofNullable(myClass) .map(MyClass::getMyData) .map(MyData::transformData) .map(TransformedData::getName) .orElse(null);
- 每一步
map都会判断当前Optional是否为非空,只有非空时才执行对应的getter/方法 - 任意一步返回null,后续的
map都会被跳过,最终orElse(null)返回null - 绝对不能把整个链式调用直接放进
Optional.ofNullable(),那样和直接调用没区别,中间任何一步null都会先抛NPE
内容的提问来源于stack exchange,提问作者codernoob8
相关产品推荐
相关产品推荐

