应优先用 getordefault() 替代 get(),区分“键不存在”和“值为null”时才用 optional.ofnullable();空集合统一用 collections.emptylist();mybatis 查询需声明返回 list 以避免 null;stream 中用 filter(objects::nonnull) 或显式判空处理 null 元素。

Java 中 get() 方法返回 null 导致 NPE 怎么办
别直接调用 get() 后链式操作,比如 map.get("key").toString() —— 这是 NPE 高发区。核心不是“要不要用 Optional”,而是“谁该负责判空”。集合类(如 Map、List)本身不承诺非空,所以调用方必须处理缺失情况。
- 优先用
Map.getOrDefault(key, defaultValue)替代get(),尤其当默认值语义明确(如0、""、Collections.emptyList()) - 若需区分“键不存在”和“键存在但值为
null”,才考虑Optional.ofNullable(map.get(key)),但注意:这不能掩盖设计问题——Map存null值本身就是反模式 - 避免把
Optional当容器传参或返回,它不是集合替代品;方法签名里出现Optional<list>></list>通常说明接口职责混乱
Spring Boot 里 Controller 返回空集合该用 new ArrayList() 还是 Collections.emptyList()
用 Collections.emptyList()。它返回不可变空列表,内存零开销,且明确表达“这里就是没数据”,比新建对象更轻量、更安全。
-
Collections.emptyList()是静态常量,线程安全,复用率高;new ArrayList()每次都分配对象,GC 压力略增 - 如果后续代码会尝试
add()或set(),必须提前告知调用方这是只读集合,否则抛UnsupportedOperationException - JSON 序列化(如 Jackson)对两者输出一致:
[],无需额外配置
MyBatis 查询结果为空时返回 null 而不是空集合,怎么统一处理
在 Mapper 接口方法上加 @Options(flushCache = false, useCache = false) 没用;真正有效的是改 XML 的 resultType 或注解中的返回类型,并配合 MyBatis 的默认行为调整。
- 确保方法声明返回
List<t></t>(而非T),MyBatis 会自动返回空ArrayList,不会为selectList类型返回null - 如果是
selectOne场景(如selectByPrimaryKey),MyBatis 默认查不到就返回null—— 这时应在 Service 层包装:用Optional.ofNullable(mapper.selectOne(id)),而不是让 Controller 直接拆箱 - 不要在 XML 里写
<if test="list != null"></if>判空,因为 MyBatis 已保证集合类型返回值永不为null
Stream 处理集合时遇到 NullPointerException 怎么快速定位
不是 Stream 本身抛的,是中间操作里某个元素为 null,比如 list.stream().map(String::length).collect(...) 中有 null 字符串。
- 加
.filter(Objects::nonNull)是最直接的防御手段,但要清楚过滤掉的是什么业务数据 - 用
.map(item -> item == null ? 0 : item.length())显式处理,比抛异常更利于排查逻辑分支 - IDEA 调试时,在 Stream 链上右键 “Trace Current Stream Chain”,能直观看到哪一步输入是
null;VS Code 需配合断点 + 中间变量提取
Optional 重要得多。










