Java中switch不支持null,必须提前判空;常用做法是if先检查null再进入switch,或用Objects.equals()替代,也可封装安全匹配方法,JDK21+模式匹配switch仍不支持null。

Java 中 switch 语句在 JDK 7 及以后支持字符串,但**不支持 null 值**——如果传入 null,会直接抛出 NullPointerException。因此,处理可能为 null 的字符串时,必须**提前判空**,不能把 null 直接丢进 switch。
先判断 null,再进入 switch
最常用、最清晰的做法是用 if 先检查是否为 null,再对非空字符串使用 switch:
- 把
null当作一种特殊分支单独处理(比如返回默认值、记录日志或抛出自定义异常) - 其余逻辑交给
switch处理确定的字符串值
示例:
String status = getStatus(); // 可能为 null
if (status == null) {
System.out.println("状态未设置");
} else {
switch (status) {
case "STARTED":
startProcess();
break;
case "PAUSED":
pauseProcess();
break;
case "COMPLETED":
finishProcess();
break;
default:
System.out.println("未知状态: " + status);
}
}
用 Objects.equals() 配合 if-else 替代 switch(适合分支少的情况)
如果只有两三个取值,且包含 null,用 Objects.equals() 写成平铺的 if-else 更安全、更直观:
立即学习“Java免费学习笔记(深入)”;
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- 避免了
switch的限制,Objects.equals(null, null)返回true - 可统一处理
null和各字符串字面量
示例:
String input = getUserInput();
if (Objects.equals(input, "save")) {
save();
} else if (Objects.equals(input, "cancel")) {
cancel();
} else if (Objects.equals(input, null)) {
System.out.println("输入为空");
} else {
System.out.println("不支持的操作");
}
封装成工具方法,复用判空逻辑
若多处需要类似逻辑,可封装一个安全的字符串匹配方法,内部处理 null 并支持类似 switch 的语义:
- 接收字符串和多个
case值(含可选的null分支) - 返回对应索引、枚举或执行对应函数
- 保持调用简洁,隐藏判空细节
例如(简化版):
public static void safeSwitch(String s, Consumer<String> onNull,
Map<String, Runnable> cases) {
if (s == null) {
onNull.accept(null);
} else {
cases.getOrDefault(s, () -> System.out.println("未知值: " + s)).run();
}
}
// 使用:
safeSwitch(userAction,
ignored -> log.warn("操作未指定"),
Map.of("submit", this::doSubmit,
"reset", this::doReset));
注意:JDK 21+ 的模式匹配 switch 不改变 null 限制
即使使用预览特性如 switch 模式匹配(switch (obj) { case String s -> ... }),它仍要求表达式本身非 null;case null 语法在标准 switch 中**不合法**(会编译错误)。所以 null 判定仍需放在 switch 外部。

















