Skip to content

switch 语句

多分支选择结构,适合处理离散值的分支判断。

基本语法

传统写法

java
int day = 3;
String result;

switch (day) {
    case 1:
        result = "星期一";
        break;
    case 2:
        result = "星期二";
        break;
    case 3:
        result = "星期三";
        break;
    case 4:
        result = "星期四";
        break;
    case 5:
        result = "星期五";
        break;
    case 6:
        result = "星期六";
        break;
    case 7:
        result = "星期日";
        break;
    default:
        result = "未知";
}

System.out.println(result);  // 星期三

switch 的四个要素:

元素说明
switch开关关键字
case分支标签
break跳出 switch(可选)
default默认分支(可选)

switch 穿透

不使用 break 实现多值合并

相邻的 case 可以不加 break,实现相同的处理逻辑。

java
int score = 85;
String grade;

switch (score / 10) {
    case 10:
    case 9:
        grade = "A";
        break;  // 10 和 9 都执行到这里
    case 8:
        grade = "B";
        break;
    case 7:
        grade = "C";
        break;
    default:
        grade = "D";
}

System.out.println(grade);  // B

搭配枚举和字符串

枚举类型

java
enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

Season season = Season.SUMMER;

switch (season) {
    case SPRING:
        System.out.println("春天");
        break;
    case SUMMER:
        System.out.println("夏天");
        break;
    case AUTUMN:
        System.out.println("秋天");
        break;
    case WINTER:
        System.out.println("冬天");
        break;
}

字符串(JDK 7+)

java
String status = "active";

switch (status) {
    case "active":
        System.out.println("活跃用户");
        break;
    case "inactive":
        System.out.println("非活跃用户");
        break;
    case "banned":
        System.out.println("被封禁用户");
        break;
    default:
        System.out.println("未知状态");
}

JDK 12+ 增强特性

箭头表达式

-> 替代冒号,不需要 break,且更简洁。

java
String result = switch (day) {
    case 1 -> "星期一";
    case 2 -> "星期二";
    case 3 -> "星期三";
    case 4 -> "星期四";
    case 5 -> "星期五";
    case 6, 7 -> "周末";  // 多个值合并
    default -> "未知";
};

多值合并

用逗号分隔多个值,简化穿透逻辑。

java
int score = 85;

String grade = switch (score / 10) {
    case 10, 9 -> "A";
    case 8 -> "B";
    case 7 -> "C";
    default -> "D";
};

yield 关键字(JDK 13+)

在箭头表达式块中返回值。

java
String result = switch (status) {
    case "active" -> {
        System.out.println("处理活跃状态");
        yield "活跃";
    }
    case "inactive" -> {
        System.out.println("处理非活跃状态");
        yield "非活跃";
    }
    default -> "未知";
};

完整示例

获取星期名称

java
// 传统写法
public String getDayName(int day) {
    switch (day) {
        case 1: return "星期一";
        case 2: return "星期二";
        case 3: return "星期三";
        case 4: return "星期四";
        case 5: return "星期五";
        case 6: return "星期六";
        case 7: return "星期日";
        default: return "无效日期";
    }
}

// JDK 12+ 写法
public String getDayName(int day) {
    return switch (day) {
        case 1 -> "星期一";
        case 2 -> "星期二";
        case 3 -> "星期三";
        case 4 -> "星期四";
        case 5 -> "星期五";
        case 6, 7 -> "周末";
        default -> "无效日期";
    };
}

带逻辑的写法

java
public String getTrafficInfo(String vehicleType) {
    return switch (vehicleType) {
        case "car" -> {
            int speed = calculateSpeed();
            yield "车速: " + speed + " km/h";
        }
        case "bike" -> {
            int speed = calculateSpeed();
            yield "车速: " + speed + " km/h";
        }
        case "bus" -> "限速 50 km/h";
        default -> "未知类型";
    };
}

枚举与增强 switch

java
public enum Color { RED, GREEN, BLUE }

public String getColorName(Color color) {
    return switch (color) {
        case RED -> "红色";
        case GREEN -> "绿色";
        case BLUE -> "蓝色";
    };
}

注意事项

枚举 switch 的完整性

增强 switch 编译器会检查枚举是否覆盖所有情况。

java
enum Status { ACTIVE, INACTIVE, BANNED }

// ❌ 传统 switch:可能遗漏 case
switch (status) {
    case ACTIVE:
        // ...
        break;
    // 缺少 INACTIVE 和 BANNED
}

// ✅ 增强 switch:编译器检查完整性
// 如果遗漏,编译器会报错
return switch (status) {
    case ACTIVE -> "活跃";
    case INACTIVE -> "非活跃";
    case BANNED -> "封禁";
};

null 检查

switch 不接受 null,会抛出 NullPointerException。

java
String status = null;

// ❌ NPE
switch (status) {
    case "active":
        // ...
}

// ✅ 先检查
if (status != null) {
    switch (status) {
        case "active":
            // ...
    }
}

基于 VitePress 构建