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

            }
        }
    }
}

      上述代码中,执行顺序:

  1. s = "1",匹配到 case "1"
  1. 执行 case "1" 中的代码,if 条件不成立
  1. 由于 case "1" 中没有 break,继续执行 case "2"
  1. 执行 case "2" 中的代码,打印 "2"
  1. 遇到 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;
        }
    }
}

注意事项:

  1. Java 中的 switch-case 语句会从匹配的 case 开始执行,然后继续执行后面的所有 case,直到遇到 break
  2. 这种特性称为 fall-through(贯穿)
  3. 如果不想要 fall-through 特性,需要在每个 case 后添加 break
  4. 在 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";
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值