java中switch-case的穿透由是否写break决定,默认存在;default分支可选,写了才生效;java12+箭头语法自动阻断穿透,无需break。

Java 中 switch-case 的穿透(fall-through)和默认处理不是“配置”出来的,而是由语法结构和关键字自然决定的。关键在于你是否写 break,以及是否定义 default 分支。
穿透行为是默认存在的,不加 break 就会穿透;default 分支是可选的,写了才生效。
如何让 case 发生穿透
穿透指匹配某个 case 后,不中断执行,继续运行后续 case(包括 default)中的代码。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 去掉对应 case 末尾的
break;即可 - 穿透是顺序执行,不重新判断下一个 case 的值是否匹配
int day = 2;
switch (day) {
case 1:
System.out.println("周一");
// 没有 break → 穿透到 case 2
case 2:
System.out.println("周二");
// 没有 break → 穿透到 case 3
case 3:
System.out.println("周三");
break; // 到这里才停止
default:
System.out.println("其他");
}
// 输出:周二、周三
- 多个 case 共享同一段逻辑时,常利用穿透
例如:将 'a'、'e'、'i'、'o'、'u' 都视为元音字母
char c = 'e';
switch (c) {
case 'a':
case 'e': // 无语句,直接穿透
case 'i':
case 'o':
case 'u':
System.out.println("元音");
break;
default:
System.out.println("辅音");
}
如何设置默认处理(default)
default 是一个可选分支,当所有 case 值都不匹配表达式时执行。
-
default可以放在任意位置(开头、中间、结尾),但建议放最后,逻辑更清晰 - 它不需要
case标签,也不需要值匹配 - 如果没写
default,且没有 case 匹配,整个 switch 就什么都不执行
String status = "pending";
switch (status) {
case "success":
System.out.println("操作成功");
break;
case "failed":
System.out.println("操作失败");
break;
default: // 所有其他值都走这里
System.out.println("状态未知:" + status);
}
-
default后也建议加break(尤其在它不是最后一项时),避免意外穿透
Java 12+ 新写法自动阻断穿透
从 Java 12 开始支持箭头语法(->),天然不穿透,无需 break:
int x = 2;
String result = switch (x) {
case 1 -> "一";
case 2 -> "二"; // 自动结束,不会跑到 case 3
case 3 -> "三";
default -> "其他";
};
- 多个值合并写法也更简洁:
case 1, 2, 3 -> "小数字";
- 若需执行多条语句,用
{ }和yield:case 4 -> { System.out.println("处理四"); yield "四"; }
常见误区提醒
-
break只跳出当前switch,不影响外层循环(如需跳出循环,要用带标签的break) -
return也能终止 switch,效果等同于break(但只适用于方法内) -
case值必须是编译期常量(如字面量、static final 变量),不能是变量或表达式 -
switch表达式支持类型:byte、short、char、int、枚举、String(JDK7+)、包装类(自动拆箱)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










