在 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";
};

1117

被折叠的 条评论
为什么被折叠?



