Java中如何基于键过滤取值避免空指针解引用问题
Java空指针规避实现方案
方案1:Optional链式调用(适配2个键的场景)
直接用JDK 8及以上自带的Optional容器封装查询逻辑,无需手动写null判断:
import java.util.Optional; // 仅需规避getOrderItemValue返回null的场景 OrderItem orderItem = Optional.ofNullable(ServicesUtil.getOrderItemValue(drawStore.getOrderItem().getItem(), "Item1")) .orElseGet(() -> ServicesUtil.getOrderItemValue(drawStore.getOrderItem().getItem(), "Item2"));
如果连drawStore.getOrderItem()也存在返回null的风险,可扩展链式判断:
OrderItem orderItem = Optional.ofNullable(drawStore.getOrderItem()) .map(OrderItem::getItem) .flatMap(item -> Optional.ofNullable(ServicesUtil.getOrderItemValue(item, "Item1")) .or(() -> Optional.ofNullable(ServicesUtil.getOrderItemValue(item, "Item2")))) // 双键都查不到时可选择返回默认值/抛业务异常,避免后续拿到null .orElseThrow(() -> new IllegalArgumentException("未查询到匹配的OrderItem"));
方案2:Stream流式遍历(适配多键扩展场景)
如果后续可能新增更多备用查询键,可把键按优先级存入列表,用流遍历匹配第一个非空结果:
import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; // 按优先级排序的查询键,新增键直接往列表里加即可 List<String> queryKeys = Arrays.asList("Item1", "Item2"); OrderItem orderItem = Optional.ofNullable(drawStore.getOrderItem()) .map(OrderItem::getItem) .map(item -> queryKeys.stream() .map(key -> ServicesUtil.getOrderItemValue(item, key)) .filter(Objects::nonNull) .findFirst() // 双键都查不到时的处理逻辑 .orElseThrow(() -> new IllegalArgumentException("未查询到匹配的OrderItem")) ) .orElseThrow(() -> new IllegalArgumentException("OrderItem为空"));
以上两种方案都把null判断逻辑交给JDK原生API处理,全程无需手动写null校验逻辑,同时可以通过自定义兜底逻辑(返回默认值/抛异常)从根源避免后续代码拿到null引用触发空指针解引用异常。
内容的提问来源于stack exchange,提问作者Ranjit M
相关产品推荐
相关产品推荐

