java中switch支持byte、short、char、int、string(j7+)、enum、record(j14+)和sealed类(j21+),case值须为编译期常量;传统语句靠break防穿透,增强型表达式(j14+)用箭头语法天然防穿透并支持返回值。

Java 中处理多分支选择,主要靠 switch-case 结构,它比一连串 if-else 更简洁、可读性更强,也更适合匹配离散的固定值。
支持哪些类型和值?
switch 表达式只接受有限类型:
- 基本类型:byte、short、char、int(及其包装类)
- String(Java 7+,按内容比较,无需 intern)
- enum(类型安全,IDE 可补全)
- record(Java 14+)、sealed 类(配合模式匹配,Java 21+)
所有 case 后的值必须是编译期常量:字面量(如 "OK"、1)、final static 变量或枚举常量。不能是普通变量或运行时计算结果(如 case x: 或 case s.toUpperCase():)。
break 和穿透逻辑怎么控制?
传统 switch 语句中,没有 break 就会“穿透”到下一个 case —— 这是设计特性,不是 bug,但容易出错:
- 每个分支独立执行:每个 case 后加 break(最常见)
- 多个值共享逻辑:连续写 case,共用一个 break,例如
case 1: case 2: case 3: System.out.println("工作日"); break; - 有意穿透(极少见):比如状态流转,必须加明确注释说明意图
建议开启 IDE 警告(如 IntelliJ 的 “Missing ‘break’ in switch statement”),并用单元测试覆盖所有分支路径。
default 分支为什么不能省?
default 不是语法强制项,但它是健壮性的刚需:
- 输入不可控时(如用户输入、外部接口返回值),漏掉 default 可能导致静默失败
- 即使你认为“不可能走到这里”,也应保留 default 并抛异常或打日志,避免问题被掩盖
- default 放在末尾是惯例;若放中间,会影响执行顺序,不推荐
Java 14+ 推荐用 switch 表达式
新项目优先使用增强型 switch(箭头语法),它天然规避穿透风险,还能直接返回值:
- 写法简洁:
case MON -> "周一";,无需 break - 支持多语句块:
case MON -> { System.out.println("上班"); yield "周一"; } - 编译器强制要求覆盖所有可能情况(或有 default),安全性更高
- 可直接赋值:
String desc = switch (status) { case "UP" -> "在线"; default -> "离线"; };
注意:switch 表达式不支持区间判断(如 1–12 月)、布尔条件或 null 输入——这些场景仍需 if 或策略模式配合。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











