为何switch语句中default块内的case无匹配时仍执行?(OCP-17)
关于Java Switch中default与case并列的疑问解答
先明确你的代码及实际运行结果(修正了描述中的输出误差):
static void f11(){ var tailFeathers = 3; final var one = 1; switch (tailFeathers) { case one: System.out.print(3 + " "); default: case 44: System.out.print(5 + " "); } }
这段代码实际运行输出为5 ,你提到的5 2 1 大概率是输入笔误。
下面针对你的核心疑问逐一解答:
1. 为什么这种写法不会触发编译错误?
Java的switch语法里,case和default都是跳转标签,不存在“嵌套”关系——你看到的缩进只是代码格式,编译器完全忽略缩进。default并不是一个“块”的开头,它和所有case标签一样,是switch语句体中的一个标记位置,语法上允许和其他case标签任意顺序排列,哪怕看起来像是在default下方。
2. 为什么匹配default后会执行case44的代码?
这是switch的贯穿(fall-through)机制在起作用:
- 当switch表达式的值(这里是3)没有匹配到任何case标签时,程序会跳转到default标签的位置开始执行。
- 由于代码中没有
break语句中断执行,程序会从default的位置继续往下顺序执行,包括后续case 44对应的语句——此时case 44只是一个标签,程序已经跳过了匹配阶段,直接执行标签后的代码。 - 直白说:一旦进入switch的某个标签位置,就会一路往下执行,直到遇到break、return或者switch语句结束。
3. 关于default的本质
default不是“覆盖”case,它只是一个兜底的跳转入口:当所有case都不匹配时,就从default的位置开始执行。它和case的地位是平等的,只是触发条件不同——case匹配特定值,default匹配“所有其他未被case覆盖的值”。
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

