空指针异常应在编码阶段预防而非运行时捕获,需通过Objects.requireNonNull校验必不为空的参数、构造器入参和核心对象,返回值避免null而改用空集合或Optional,字符串和集合操作前须判空,并借助@NonNull等注解和IDE预警提前拦截。

空指针异常(NullPointerException)不是靠 try-catch 捕获来“处理”的,而是要在代码写出来之前就把它挡在外面。它本质是逻辑漏洞——你本以为某个引用一定不为 null,结果它偏偏是 null,然后调用方法或访问字段时 JVM 就直接崩了。
别在运行时补漏,要在编码时设防。
明确入口判空,用 Objects.requireNonNull 强制契约
方法参数、构造器入参、核心业务对象,只要它“必须存在”,就立刻校验:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Objects.requireNonNull(name, "用户名不能为空") -
Objects.requireNonNull(user, "用户对象不可为空")
比手写if (x == null) throw new NullPointerException()更简洁、语义更清晰,还能带提示信息,让问题暴露得早、定位得准。
返回值不甩 null,改用空集合或 Optional
- 方法返回集合时,写
return Collections.emptyList(),别写return null; - 查找类操作(如
findUserById(id))适合返回Optional<User>,调用方必须显式处理“没找到”的情况; - 不要把
Optional用在字段、参数或返回Optional<List<T>>这种嵌套结构上——这会增加理解成本,还容易误用.get()导致二次 NPE。
字符串和集合操作前先确认非空
- 字符串判空推荐:
str != null && !str.isBlank()(JDK 11+),低版本可用StringUtils.isEmpty(str); - 集合字段声明就初始化:
private List<Item> items = new ArrayList<>();,避免items.add(...)直接 NPE; - 调用
.size()、.isEmpty()、.get(0)前,先确认集合本身不为 null。
借助注解和 IDE 提前预警
- 在参数、字段、返回值上加
@NonNull(Lombok)或@NotNull(JetBrains),IDE 会实时标红潜在风险; - 启用编译器检查(如
-Xlint:unchecked)或集成 SpotBugs,把很多空值隐患拦在编译期。
不复杂但容易忽略。
立即学习“Java免费学习笔记(深入)”;

















