java 7+ switch 支持 string 但不处理 null,需显式判空;case 标签必须是编译期常量;java 14+ 推荐用箭头表达式避免 fall-through,并强制穷尽性检查。

switch 用 String 时必须注意 null 安全
Java 7+ 支持 switch 作用于 String,但底层是调用 String.hashCode() 和 equals(),一旦传入 null,直接抛 NullPointerException —— 这不是编译错误,运行时才崩。
- 务必在
switch前加空值判断,比如if (str == null)单独处理 - 别指望
default分支能兜住null;它不匹配,也不会执行 - 如果用的是 Java 21+ 的模式匹配(
switch表达式 + 模式),可用case null ->显式捕获,但老版本不行
case 标签只能是编译期常量
case 后面的值必须是字面量、static final 基本类型或字符串,不能是普通变量、方法调用或运算表达式。
- 错例:
case getValue():(getValue()是方法)→ 编译失败 - 错例:
case MAX_SIZE + 1:(即使MAX_SIZE是final int,加法也不算“编译时常量”)→ 编译失败 - 对例:
static final String MODE_A = "auto"; case MODE_A:✅ - 枚举类名本身是常量,所以
case Status.ACTIVE:没问题
忘记 break 会导致 fall-through,但新语法可避免
传统 switch 语句中漏写 break,会顺序执行后续所有 case 分支(包括 default),这是历史包袱,极易引发逻辑错误。
- 老写法:每个
case块末尾手动加break,漏一个就出事 - Java 14+ 推荐用
switch表达式(带->箭头):case "a" -> doA();,自动终止,不 fall-through - 箭头形式不支持穿透,想复用逻辑得显式调方法,而不是靠省略
break - 注意:表达式必须有返回值或用
yield,纯语句块得用{ ... }包裹
switch 表达式在 return 或赋值场景更干净
当你要根据条件返回不同值,或者给某个变量赋值时,用 switch 表达式比语句更安全、更紧凑。
立即学习“Java免费学习笔记(深入)”;
- 语句写法容易漏
return或提前结束,导致编译报错 “missing return statement” - 表达式强制覆盖所有可能分支(或有
default),编译器帮你检查穷尽性 - 示例:
String level = switch (score) { case 90 -> "A"; case 80 -> "B"; default -> "C"; }; - 如果
score是int,但你只写了case 90和case 80,没default,Java 17+ 会报错 —— 这其实是保护机制
真正麻烦的不是语法怎么写,而是旧代码里混着语句风格和表达式风格,又穿插了 null 判断和枚举转换。改的时候别只盯 switch 本身,先理清输入来源和下游怎么接。










