字符串比较时应将常量放左边,如"success".equals(status),可防npe;null、""、" "语义不同,推荐用stringutils.isblank()或自定义isblank方法按序判空。

字符串比较时把常量放左边,是最简单也最有效的防 NPE 办法。
用字面量调用 equals 方法
写成 "SUCCESS".equals(status),而不是 status.equals("SUCCESS")。前者在 status 为 null 时返回 false;后者会直接抛 NullPointerException。
这个规则适用于所有 String 类型的判等场景:状态码、角色名、配置项、类型标识等。
注意:equalsIgnoreCase 和 matches 不具备这种保护能力,仍需前置判空。
统一处理三类“空”语义
字符串可能为 null、""(空串)、" "(纯空白),它们业务含义不同,不能混为一谈:
- null:未初始化,调用任何方法都会崩
- "":合法对象,可安全调用 length()、trim() 等
- " ":含空格/制表符/换行,视觉为空但 isEmpty() 返回 false
推荐使用 Apache Commons Lang 的 StringUtils.isBlank(str),它内部已按顺序判断:null → isEmpty() → 全 whitespace,一行覆盖全部边界。
无依赖时可自定义:public static boolean isBlank(String s) { return s == null || s.isEmpty() || s.trim().isEmpty(); }——顺序不可颠倒。
从源头减少 null 字符串产出
与其反复防御,不如少造 null:
- 字段声明时设默认值:private String name = "";
- DTO 反序列化前加 @NotBlank 或 @NotNull 校验
- DAO/Service 返回字符串,避免 return null;可用 Optional
封装 - JSON 解析后做一次空值归一化,例如用反射工具将所有 String 字段的 null 转为 ""
IDE 和静态检查辅助
IntelliJ IDEA 可开启 String equality check 警告,自动标出 variable.equals("xxx") 这类高危写法。
结合 SonarQube 或 Alibaba Java Coding Guidelines 插件,在编译期拦截不安全的 equals 调用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











