Java中可用switch穿透特性合并相同天数的月份:31天(1、3、5、7、8、10、12月),30天(4、6、9、11月),2月单独判断闰年,default防非法输入,每case以return/throw/break终止避免误穿透。

Java 中可以用 switch 的穿透(fall-through)特性,配合 case 合并来简洁地处理不同月份的天数——特别是把天数相同的月份归为一组,避免重复写多个 case 语句。
利用 fall-through 合并相同天数的月份
一年中,有些月份天数相同:31 天(1、3、5、7、8、10、12 月),30 天(4、6、9、11 月),2 月则需单独判断(平年 28,闰年 29)。借助 switch 穿透,可以让多个 case 共享同一段逻辑,无需重复 return 或 break。
示例代码:
public static int getDaysInMonth(int year, int month) {
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
return 31;
case 4: case 6: case 9: case 11:
return 30;
case 2:
return isLeapYear(year) ? 29 : 28;
default:
throw new IllegalArgumentException("月份必须是 1-12");
}
}
private static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
关键点说明
-
多个 case 写在同一行或连续排列,不加 break,就自然穿透:JVM 会顺序执行直到遇到
return或break,所以前两组case后直接跟return,无需显式break。 -
2 月必须单独处理:因为天数依赖闰年逻辑,不能和其他月份合并;且它后面没有穿透需求,所以只写一个
case 2:即可。 - default 不可少:防止传入非法月份(如 0、13),提升健壮性。
注意:别误用穿透导致逻辑错误
switch 穿透是“无意识”的行为,不是语法糖。如果忘了在某个 case 块末尾加 break 或 return,就会意外执行下一个 case 的代码——这在输出天数场景下容易引发错误(比如把 2 月当成 30 天)。
立即学习“Java免费学习笔记(深入)”;
安全做法:
- 每个
case分支以return、throw或break显式终止; - 优先用
return(尤其在方法中),比break更清晰; - 现代 IDE 通常会警告“missing break”,可开启检查。
对比 if-else 写法更直观在哪?
用 if-else 判断 12 个月,至少要写 12 个条件分支;而 switch + 穿透只需 3 组逻辑,结构紧凑、可读性强,也更符合“分类枚举”的语义。尤其当业务中还有类似“季度分组”“星期几归类”等需求时,这种写法复用性高。


















