← 中文资源

简体中文版本

Java 报 NullPointerException 并带有帮助性消息

通过帮助性消息、堆栈跟踪与防御式访问,定位 NullPointerException 的空值来源。

阅读英文原文

症状

应用抛出 NullPointerException,在现代 JDK 上消息会指出究竟哪个表达式为 null,例如 Cannot invoke String.length() because name is null。同一代码对某些输入通过、对另一些失败,说明常存在的值偶尔缺失。链式调用与自动装箱会掩盖是哪一段返回了 null。

诊断

读取帮助性 NPE 消息;用堆栈向上追踪 null 来源;在边界用 requireNonNull 快速失败。

java -XX:+ShowCodeDetailsInExceptionMessages App 2>&1 | head

根因

失败处使用的引用为 null,通常因为更早的调用返回了 null 或字段从未被设置,而代码假定了值存在。

修复

在 API 边界用 requireNonNull 或 Optional 校验输入,返回空集合而非 null 以减少判空,并用可空性注解让编译器与工具提前告警。

验证

重跑失败路径,确认或在正确边界以预期校验消息失败,而非在堆栈深处出现匿名 NPE。

常见陷阱

到处 catch NPE 会掩盖真实缺陷;应修正产生 null 的契约。