JDK 12起switch可作为表达式使用,引入->箭头语法替代:和break,支持返回值、无穿透风险;需覆盖所有输入,可用yield返回复杂逻辑结果,右侧可throw异常,整体有确定类型。

JDK 12 起,switch 不再只是语句,还能作为表达式使用,核心变化是引入 -> 箭头语法,取代传统 : 和 break。写法更紧凑、无穿透风险,且天然支持返回值。
基础写法:单表达式分支
每个 case 后用 -> 连接一个表达式,匹配即执行并返回该值,无需 break:
-
case后可跟多个常量,用逗号分隔(如case "MON", "TUE" -> "工作日") - 右侧必须是合法表达式(字符串、数字、方法调用等),不能是纯语句(如
System.out.println()单独出现会编译报错) - 必须覆盖所有可能输入:要么穷尽所有枚举/常量值,要么带
default分支
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
case "MON", "TUE", "WED", "THU", "FRI" -> "工作日";
case "SAT", "SUN" -> "周末";
default -> "未知";
};
复杂逻辑:用代码块 + yield
当需要多行操作(比如打印日志、计算变量、调用方法)时,用花括号 { } 包裹,并用 yield 显式返回结果:
-
yield是 Java 12+ 新增的关键字,专用于从switch表达式中返回值 - 块内可以有任意语句,但最后一句必须是
yield(或throw) - 不能用
return,那会退出整个方法,不是退出当前分支
示例:
int len = switch (str) {case null -> -1;
case "" -> 0;
default -> {
System.out.println("正在计算长度");
yield str.length();
}
};
异常处理:default 或特定 case 直接 throw
箭头右侧可以直接写 throw 语句,适合非法输入快速失败:
- 抛出异常也视为一种“返回路径”,满足表达式必须有结果的要求
- 推荐在
default中抛出,或对明确不支持的值单独设case - 异常类型需与上下文兼容(例如赋值给
String变量时,不能只抛异常而无其他分支返回String)
示例:
String season = switch (month) {case "DEC", "JAN", "FEB" -> "冬季";
case "MAR", "APR", "MAY" -> "春季";
default -> throw new IllegalArgumentException("不支持的月份: " + month);
};
类型与赋值:必须有明确返回类型
整个 switch 表达式有确定类型,由所有分支的返回值共同推断:
- 所有
->右侧表达式、yield值、throw之外的分支,类型必须一致或可统一为某个公共父类型 - 不能混用不兼容类型(如有的分支返回
String,有的返回int,又没default抛异常) - 可直接用于变量初始化、方法返回、三元运算符右侧等任何表达式位置
示例(返回 Integer):
case "OK" -> 200;
case "ERROR" -> 500;
default -> null;
};










