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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:05