java 7起支持字符串switch,需编译期常量且判空;java 5起支持枚举switch,case直接写常量名;java 14+新增->语法,支持表达式返回和多值匹配。

Java 中 switch-case 支持字符串和枚举,但有明确的版本要求和使用规范,不是所有写法都安全或合法。
字符串 switch 的用法和限制
从 Java 7 开始支持 String 类型作为 switch 表达式。底层通过 hashCode() 和 equals() 实现匹配,不是引用比较。
- case 值必须是编译期常量:只能是字符串字面量(如
"start")或static final String常量,不能是普通变量或拼接结果(如s1 + s2) - 区分大小写:
"OK"和"ok"是两个不同分支 - 不接受
null:传入null会直接抛出NullPointerException,必须提前判空 - 示例:
String status = getUserStatus(); if (status == null) { handleUnknown(); } else { switch (status) { case "ACTIVE": activateUser(); break; case "INACTIVE": deactivateUser(); break; default: log.warn("Unknown status: " + status); } }
枚举 switch 的写法要点
Java 5 起支持枚举类型,写法简洁且类型安全。
- case 后直接写枚举常量名,不加类名(如
case RED,不是case Color.RED) - 编译器可检查是否覆盖全部枚举值(启用
-Xlint:switch或 IDE 提示能发现遗漏) - 推荐加上
default分支,避免未来新增枚举值时逻辑失效 - 示例:
enum Level { LOW, MEDIUM, HIGH }
Level level = getCurrentLevel(); switch (level) { case LOW: setPriority(1); break; case MEDIUM: setPriority(3); break; case HIGH: setPriority(5); break; default: throw new IllegalStateException("Unexpected level: " + level); }
<strong>Java 14+ 的增强写法(推荐升级后使用)</strong>
新语法用 `->` 替代 `:`,自动终止、无穿透风险,还能作为表达式返回值。
- 单表达式分支直接返回:`case RED -> "stop";`
- 多个值共享逻辑:`case "debug", "info" -> logger.info(msg);`
- 多语句需用大括号 + `yield`:
```java
String result = switch (level) {
case LOW -> "low";
case MEDIUM -> "medium";
case HIGH -> {
log.debug("High level detected");
yield "high";
}
};
常见错误要避开
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- 把运行时计算的字符串当 case(编译失败)
- 忘记对字符串判空(运行时报 NPE)
- 枚举 switch 漏掉某个常量又没写
default(逻辑隐患) - 在老版本 JDK(如 Java 6)里用字符串 switch(编译不通过)
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










