Java中String的switch遇null会抛NullPointerException,需主动防御:①switch前if判空;②用Objects.equals()链式判断;③预处理为哨兵值;④封装安全switch工具方法。

Java 中 String 类型的 switch 语句在遇到 null 时会直接抛出 NullPointerException,因为底层调用了 String.hashCode() 和 String.equals(),而 null 无法调用这些方法。这不是语法错误,而是运行时行为,必须主动防御。
提前判空,用 if 兜底
最直接、最安全的做法是在 switch 前加一层 if (str == null) 判断,把 null 分支单独处理,再让非 null 字符串进入 switch:
- 适用于业务逻辑中
null有明确含义(如“未设置”“忽略”)的场景 - 代码清晰,符合 Java 习惯,JVM 无额外开销
- 示例:
if (str == null) { System.out.println("字符串为空"); } else { switch (str) { case "apple": System.out.println("苹果"); break; case "banana": System.out.println("香蕉"); break; default: System.out.println("未知水果"); } }
用 Objects.equals() 配合 if-else 替代 switch
如果分支不多(比如 3~5 个),且想统一处理 null,可改用 Objects.equals() 写链式 if-else:
-
Objects.equals(null, "xxx")返回false,不会 NPE - 适合需要把
null当作一个合法 case 的情况(例如和"null"字符串区分) - 示例:
if (Objects.equals(str, "apple")) { System.out.println("苹果"); } else if (Objects.equals(str, "banana")) { System.out.println("香蕉"); } else if (str == null) { System.out.println("传入为 null"); } else { System.out.println("未知水果"); }
预处理:用 Optional 或默认值兜底
在进入 switch 前,把 null 转为一个约定好的哨兵值(如 "__NULL__" 或空字符串),再统一 switch:
立即学习“Java免费学习笔记(深入)”;
- 保持 switch 结构简洁,适合配置驱动或枚举映射类场景
- 注意哨兵值不能和真实业务值冲突(如避免用
"",除非确认空串本身无意义) - 示例:
String safeStr = str != null ? str : "__NULL__"; switch (safeStr) { case "__NULL__": System.out.println("原始值为 null"); break; case "apple": System.out.println("苹果"); break; case "banana": System.out.println("香蕉"); break; default: System.out.println("未知"); }
静态工具方法封装(推荐用于多处复用)
如果项目中多处需要安全 switch,可封装一个工具方法,内部完成判空 + switch 逻辑:
- 提升一致性,降低重复代码和漏判风险
- 支持泛型扩展(如后续支持其他引用类型)
- 示例(简化版):
public static void safeSwitchString(String s, Consumer<String> onNull, Map<String, Runnable> cases) { if (s == null) { onNull.accept(null); return; } cases.getOrDefault(s, () -> System.out.println("default")).run(); }


















