Java 7+ switch 支持 String 是语法糖,本质为 hashCode() + equals(),需手动判空;case 值必须是编译期常量;仍存在 fall-through 风险;复杂场景推荐 Map + Function 替代。

Java 从 7 开始支持 switch 直接匹配 String,但不是 JVM 原生能力,而是编译器生成的语法糖——本质是先算 hashCode() 快速定位,再用 equals() 精确比对。
必须做非空校验
传入 null 会直接抛 NullPointerException,default 分支也捕获不到。编译不报错,运行才崩,非常隐蔽。
- 推荐写法:
if (str == null) { /* 处理空值 */ }或Objects.requireNonNull(str) - Java 21+ 的 switch 表达式支持
case null ->,但老版本不行
case 值只能是编译期常量
每个 case 后面的字符串必须在编译时就能确定,不能是变量、方法调用或拼接结果。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- ✅ 允许:
"login"、public static final String LOGIN = "login"; case LOGIN: - ❌ 不允许:
new String("login")、s1 + s2、getAction()
仍要小心 fall-through(穿透)
String 类型没改变 switch 的控制流规则:漏写 break,就会继续执行下一个 case 块。
- IDE 通常会警告 “fall-through case”,但别依赖它
- 建议每个
case块末尾都写break,哪怕后面是default - 如果真需要穿透,加明确注释,如
// fall through
复杂场景建议用 Map + Function 替代
当路由逻辑变多、要加权限、日志、异步或参数校验时,硬写 switch 很难维护。
- 可定义
Map或> Map> - 新增分支只需往 map 里 put,不用动主流程
- 天然规避 null 和穿透问题,还能统一加异常处理、超时等横切逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










