
Java 字符串比较时防范空指针异常,关键不是等它发生再捕获,而是从写法上彻底避开调用 null 引用的 equals 方法。最直接有效的做法是把字符串常量放在 equals 左侧。
常量左置:最简单可靠的写法
把字面量(如 "admin"、"SUCCESS")写在 equals 方法左边,变量放右边:
-
"admin".equals(role)—— 安全:role 为 null 时返回 false,不抛异常 -
role.equals("admin")—— 危险:role 为 null 时立即触发 NullPointerException
这条规则适用于所有基于 equals 的判断场景,包括状态码、角色名、配置值比对等。
用工具类统一判空与语义判断
当需要区分 null、""、" " 三类“空”状态时,手写判断容易出错或遗漏。推荐使用成熟工具方法:
-
StringUtils.isBlank(str)(Apache Commons Lang)—— 一行覆盖 null、空串、纯空白字符 -
StringUtils.isNotBlank(str)—— 语义更清晰,适合校验必填字段 - 无依赖时可封装:
public static boolean isBlank(String s) { return s == null || s.isEmpty() || s.trim().isEmpty(); }(注意顺序不可颠倒)
避免在日志、拼接、运算中隐式触发
字符串参与日志输出、表达式拼接或方法链调用时,也容易因未判空引发 NPE:
- 日志别写:
log.info("user=" + user.getName())→ 改用占位符:log.info("user={}", user != null ? user.getName() : "null") - 拼接前先确认非空:
if (name != null) { fullName = prefix + name; } - 调用
trim()、length()、split()等方法前,确保字符串引用不为 null
从源头减少 null 字符串产出
很多 NPE 其实来自上游主动返回了 null,而非使用方疏忽:
- DTO 字段设默认值:
private String remark = "";,避免 JSON 反序列化后为 null - 接口返回字符串时,优先返回空串而非 null;例如 DAO 层查不到备注,返回
""而非null - Controller 入参加
@NotBlank校验,400 拦截非法空值,不把风险传入 service 层
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











