症状
应用抛出 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 的契约。