Java 中 switch-case 语句的执行逻辑与避坑指南
在 Java 编程的世界里,switch-case语句是一种常用的条件判断结构,它能根据不同的条件值执行相应的代码块,简洁明了。然而,switch-case语句中存在的fall-through(贯穿)特性,却常常让开发者在不经意间掉入逻辑错误的 “陷阱”。下面我们通过一段具体的代码,深入剖析这一特性及其带来的影响。
package com.summer;import java.util.Arrays;
import java.util.List;public class SwitchCaseExample {public static void main(String[] args) {List<String> list = Arrays.asList("1");for (int i = 0, len = list.size(); i < len; i++) {String s = list.get(i); // s = "1"switch (s) {case "1": { // 匹配到这里if (s == "2") { // 这个条件不会执行,因为 s 是 "1"break;}// 这里没有 break,所以会继续执行下一个 case}case "2": { // 继续执行到这里System.out.println("2"); // 输出 "2"break;}case "3": {break;}default: {break;}}}}
}
上述代码中,执行顺序:
- s = "1",匹配到 case "1"
- 执行 case "1" 中的代码,if 条件不成立
- 由于 case "1" 中没有 break,继续执行 case "2"
- 执行 case "2" 中的代码,打印 "2"
- 遇到 break,退出 switch
要避免这种情况,应该在每个 case 后添加 break:
List<String> list = Arrays.asList("1");
for (int i=0,len= list.size();i<len;i++){String s = list.get(i);switch (s){case "1": {if(s=="2"){break;}break; // 添加 break}case "2": {System.out.println("2");break;}case "3": {break;}default: {break;}}
}
注意事项:
- Java 中的 switch-case 语句会从匹配的 case 开始执行,然后继续执行后面的所有 case,直到遇到 break
- 这种特性称为 fall-through(贯穿)
- 如果不想要 fall-through 特性,需要在每个 case 后添加 break
- 在 Java 12 及以后的版本中,可以使用 switch 表达式来避免这个问题:
// Java 12+
String result = switch (s) {case "1" -> {if (s == "2") {yield "break";}yield "1";}case "2" -> "2";case "3" -> "3";default -> "default";
};