防空指针需兼顾集合非空与元素非空:先判collection!=null&&!collection.isempty(),遍历时filter(objects::nonnull)或判item==null,取元素前双重校验,返回值用collections.emptylist()替代null。

集合本身非空,不代表里面每个元素都安全——这是很多开发者踩坑的起点。真正要防住空指针,光判集合是否为 null 或是否 isEmpty() 远远不够,还得深入到元素层级。
先确保集合本身不为空
这是所有后续操作的前提。用标准写法一次性排除两种风险:
-
collection != null && !collection.isEmpty()—— 缺一不可 - 避免只写
!collection.isEmpty(),否则collection为null时直接抛 NPE - 更稳妥可搭配
Optional.ofNullable(collection).orElse(Collections.emptyList())
遍历时主动过滤 null 元素
尤其在 Stream 操作或增强 for 循环中,元素为 null 会导致 .toString()、.equals()、自动拆箱等操作崩溃:
- 用
stream().filter(Objects::nonNull)剔除 null 后再处理 - 增强 for 中加
if (item == null) continue;或提前跳过 - 不要依赖
list.get(i)后直接调用方法,先校验item != null
获取单个元素前做双重检查
比如取第一个元素、按索引取值、或从 Map 取 value,都容易因元素为 null 而中断:
-
if (!list.isEmpty() && list.get(0) != null)才安全调用list.get(0).toString() - Map 的
get(key)返回可能为 null,建议用map.getOrDefault(key, defaultValue) - 对可能为 null 的元素调用方法前,统一用
Objects.toString(item, "")或Objects.equals(a, b)
初始化与返回值设计上规避隐患
从源头减少 null 元素出现概率:
- 集合字段声明时就初始化:
private List<string> items = new ArrayList();</string> - 方法返回集合时,用
Collections.emptyList()替代return null; - 构造对象时尽量避免字段留空,或使用 Builder 模式强制必填字段
- 数据库查询结果映射后,对可能为 null 的字段设默认值(如 MyBatis 的
@Results配置)











