Java switch支持byte/short/char/int/String/enum/record,不支持long/float/double/boolean/自定义对象;case值须为编译期常量;无break将穿透;default非强制但必须显式处理;推荐Java 14+ switch表达式提升安全性与可读性。

Java 中 switch 是处理离散值匹配的高效多路分支结构,比长链 if-else 更简洁、可读性更强,编译期还可能生成跳转表,性能更优。但它的行为有明确边界,用错容易引发穿透、漏匹配或编译报错。
支持的数据类型与常量要求
switch 表达式只接受有限类型:
- 基本类型:byte、short、char、int(及其包装类,注意非 null)
- 引用类型:String(JDK 7+)、enum(任意版本)、record(JDK 14+ 配合 switch 表达式)
- 不支持:long、float、double、boolean、任意自定义对象
每个 case 后的值必须是编译期常量:
- ✅ 正确:字面量("start"、12)、static final 字段(public static final String MODE_TEST = "test")、枚举常量(Status.READY)
- ❌ 错误:普通变量(String s = "a"; case s:)、方法调用(case getValue():)、含运算表达式(case MAX + 1:,即使 MAX 是 final)
break 控制与 fall-through 风险
没有 break 会导致执行流“穿透”到下一个 case 或 default,这是设计特性,不是 bug,但绝大多数业务逻辑不需要它。
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
立即学习“Java免费学习笔记(深入)”;
- 需要独立分支:每个非空 case 后都应加 break
- 需合并多个值执行同一逻辑:连续写多个 case,共用一个 break(例如:case 12: case 1: case 2: 表示冬季度)
- 故意穿透必须加注释说明意图,如:// fall-through: Jan/Feb/Mar all map to Q1
- IDE 建议开启 “Missing ‘break’ in switch statement” 警告,配合单元测试覆盖所有分支路径
default 分支不是可选项,而是健壮性刚需
default 不是语法强制项,但强烈建议显式添加:
- 对字符串或整数输入(如用户参数、配置项),default 应抛出明确异常或记录告警,而不是忽略
- 对枚举类型,即使当前写了全部常量,未来新增枚举项时若忘记更新 switch,default 可捕获未处理状态,避免静默失败
- default 放在末尾是惯例;若放中间或开头,后面必须加 break,否则会继续执行后续 case(易引发误解,应避免)
- 哪怕你认为“不可能到达”,也应在 default 中 throw new IllegalArgumentException("Unexpected value: " + value) 或 log.warn()
推荐升级到 Java 14+ 的 switch 表达式
新语法用箭头(->)替代冒号(:),自动终止分支、不穿透、支持返回值,更适合现代编码习惯:
- 基础写法:case "a" -> "Apple";(无需 break,自动结束)
- 多语句块:case "b" -> { System.out.println("Banana"); yield "B"; }(用 yield 返回值)
- 强制穷尽检查:如果表达式类型是 enum 且没覆盖所有常量,或没写 default,Java 17+ 会编译报错,提前暴露遗漏
- 字符串 null 安全仍需注意:传统 switch 语句遇 null 抛 NullPointerException;新表达式在 JDK 21+ 支持 case null -> 显式处理,但老版本仍需前置判空

















