公司动态

【Java踩坑笔记】46_用switch忘了写break?Java14之后有更好的写法

📅 2026/7/15 21:41:25
【Java踩坑笔记】46_用switch忘了写break?Java14之后有更好的写法
46 | 用 switch 忘了写 breakJava 14 之后有更好的写法摘要经典的switch会穿透fall-through忘了写break是常见 bug。Java 12 的 switch 表达式彻底解决了这个问题。一、问题现象// ❌ 忘记写 break穿透了publicStringgetStatusDesc(intstatus){switch(status){case0:return待处理;case1:return处理中;// ❌ 忘了 break穿透case2:return已完成;default:return未知;}}// 调用getStatusDesc(0) → 返回 待处理正确// 调用getStatusDesc(1) → 返回 处理中正确// ❌ 如果少了 return穿透到下一个 case更隐蔽的错误publicvoidprocess(intstatus){switch(status){case0:log.info(待处理);// ❌ 忘了 break穿透到 case 1case1:doProcess();break;}}二、踩坑现场场景switch里用return代替break// ❌ 以为 return 会 break实际上...publicStringgetStatusDesc(intstatus){switch(status){case0:return待处理;case1:return处理中;// ...}}// 这个写法其实没问题return 也会退出 switch// 但容易让人忽略 break 的存在三、Java 12 的 switch 表达式推荐3.1 彻底消灭穿透// ✅ Java 12switch 表达式用 -不穿透publicStringgetStatusDesc(intstatus){returnswitch(status){case0-待处理;case1-处理中;case2-已完成;default-未知;};}关键用-代替:break不会穿透3.2 需要多行逻辑用花括号// ✅ 多行逻辑publicStringgetStatusDesc(intstatus){returnswitch(status){case0-{log.info(待处理);yield待处理;// yield 返回值}case1-{doProcess();yield处理中;}default-未知;};}3.3 兼容老代码用break返回值Java 12// ✅ 老语法也可以用 break 返回值publicStringgetStatusDesc(intstatus){switch(status){case0:break待处理;// Java 12 新语法case1:break处理中;default:break未知;}}四、正确写法#4.1 新项目用 switch 表达式Java 12// ✅ 推荐箭头语法不穿透Stringdescswitch(status){case0,3-待处理;// 多个 case 合并case1-处理中;case2-已完成;default-未知;};4.2 老项目Java 8小心穿透// ✅ 老语法必须写 breakswitch(status){case0:desc待处理;break;// ✅ 必须写case1:desc处理中;break;default:desc未知;}4.3 IDEA 检查开启Fallthrough in switch statement警告如果case里没有break/return/throwIDEA 会警告确认要穿透时加// fall through注释抑制警告五、最佳实践#✅ switch 使用的 3 条规则#Java 12 用 switch 表达式-语法彻底消灭穿透老代码Java 8必须写break或加// fall through注释多个case逻辑相同时用逗号合并case 0, 3 - 什么时候穿透是有意的#// 有意穿透多个 case 共用逻辑switch(ch){casea:casee:casei:caseo:caseu:vowelCount;// 5 个元音共享同一段逻辑// fall through有意}六、小结#经典switchcase:break会穿透忘了写break是常见 bugJava 12 用 switch 表达式-语法彻底不穿透多个case合并case 0, 3 -老代码必须写break开启 IDEA 的 fall-through 检查下一篇预告日期时间计算还在用 SimpleDateFormat线程不安全——SimpleDateFormat不是线程安全的多线程共享会出问题。Java 8 用DateTimeFormatter。