case 关键字

概述

case 关键字用于switch语句中定义不同的分支,表示当switch表达式的值与case后的常量相等时执行的代码块。

语法格式

switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    default:
        // 默认代码块
}

基本用法

public class CaseExample {
    public static void main(String[] args) {
        // 数字判断
        int day = 3;

        switch (day) {
            case 1:
                System.out.println("星期一");
                break;
            case 2:
                System.out.println("星期二");
                break;
            case 3:
                System.out.println("星期三");
                break;
            case 4:
                System.out.println("星期四");
                break;
            case 5:
                System.out.println("星期五");
                break;
            case 6:
                System.out.println("星期六");
                break;
            case 7:
                System.out.println("星期日");
                break;
            default:
                System.out.println("无效的日期");
        }

        // 字符判断
        char grade = 'B';

        switch (grade) {
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
                System.out.println("良好");
                break;
            case 'C':
                System.out.println("中等");
                break;
            case 'D':
                System.out.println("及格");
                break;
            case 'F':
                System.out.println("不及格");
                break;
            default:
                System.out.println("无效等级");
        }
    }
}

字符串switch(Java 7+)

public class StringCaseExample {

    // 处理用户命令
    public static void processCommand(String command) {
        if (command == null) {
            System.out.println("命令不能为null");
            return;
        }

        switch (command.toLowerCase()) {
            case "start":
                System.out.println("启动系统");
                break;
            case "stop":
                System.out.println("停止系统");
                break;
            case "restart":
                System.out.println("重启系统");
                break;
            case "status":
                System.out.println("查看状态");
                break;
            case "help":
                System.out.println("显示帮助信息");
                break;
            default:
                System.out.println("未知命令: " + command);
        }
    }

    // 文件类型处理
    public static void handleFileType(String filename) {
        if (filename == null || !filename.contains(".")) {
            System.out.println("无效文件名");
            return;
        }

        String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();

        switch (extension) {
            case "txt":
            case "md":
            case "log":
                System.out.println("文本文件: " + filename);
                break;
            case "jpg":
            case "png":
            case "gif":
            case "bmp":
                System.out.println("图片文件: " + filename);
                break;
            case "mp4":
            case "avi":
            case "mov":
                System.out.println("视频文件: " + filename);
                break;
            case "mp3":
            case "wav":
            case "flac":
                System.out.println("音频文件: " + filename);
                break;
            case "pdf":
                System.out.println("PDF文档: " + filename);
                break;
            case "doc":
            case "docx":
                System.out.println("Word文档: " + filename);
                break;
            default:
                System.out.println("未知文件类型: " + filename);
        }
    }

    // HTTP状态码处理
    public static void handleHttpStatus(int statusCode) {
        switch (statusCode) {
            case 200:
                System.out.println("请求成功");
                break;
            case 201:
                System.out.println("资源创建成功");
                break;
            case 400:
                System.out.println("请求错误");
                break;
            case 401:
                System.out.println("未授权");
                break;
            case 403:
                System.out.println("禁止访问");
                break;
            case 404:
                System.out.println("资源未找到");
                break;
            case 500:
                System.out.println("服务器内部错误");
                break;
            case 502:
                System.out.println("网关错误");
                break;
            case 503:
                System.out.println("服务不可用");
                break;
            default:
                System.out.println("未知状态码: " + statusCode);
        }
    }

    public static void main(String[] args) {
        System.out.println("=== 处理用户命令 ===");
        processCommand("START");
        processCommand("help");
        processCommand("invalid");

        System.out.println("\n=== 文件类型处理 ===");
        handleFileType("document.txt");
        handleFileType("photo.jpg");
        handleFileType("video.mp4");
        handleFileType("unknown.xyz");

        System.out.println("\n=== HTTP状态码 ===");
        handleHttpStatus(200);
        handleHttpStatus(404);
        handleHttpStatus(500);
        handleHttpStatus(999);
    }
}

case穿透(Fall-through)

public class CaseFallThroughExample {

    // 月份天数计算
    public static int getDaysInMonth(int month, boolean isLeapYear) {
        int days;

        switch (month) {
            case 1:  // January
            case 3:  // March
            case 5:  // May
            case 7:  // July
            case 8:  // August
            case 10: // October
            case 12: // December
                days = 31;
                break;
            case 4:  // April
            case 6:  // June
            case 9:  // September
            case 11: // November
                days = 30;
                break;
            case 2:  // February
                days = isLeapYear ? 29 : 28;
                break;
            default:
                days = -1; // 无效月份
        }

        return days;
    }

    // 工作日类型判断
    public static void classifyDay(int dayOfWeek) {
        switch (dayOfWeek) {
            case 1:
                System.out.println("星期一");
                // fall through
            case 2:
                if (dayOfWeek == 2) System.out.println("星期二");
                // fall through
            case 3:
                if (dayOfWeek == 3) System.out.println("星期三");
                // fall through
            case 4:
                if (dayOfWeek == 4) System.out.println("星期四");
                // fall through
            case 5:
                if (dayOfWeek == 5) System.out.println("星期五");
                System.out.println("这是工作日");
                break;
            case 6:
                System.out.println("星期六");
                // fall through
            case 7:
                if (dayOfWeek == 7) System.out.println("星期日");
                System.out.println("这是周末");
                break;
            default:
                System.out.println("无效的星期");
        }
    }

    // 成绩等级处理(使用穿透)
    public static void processGrade(char grade) {
        switch (grade) {
            case 'A':
            case 'a':
                System.out.println("优秀成绩!");
                System.out.println("获得奖学金资格");
                break;
            case 'B':
            case 'b':
                System.out.println("良好成绩");
                System.out.println("继续保持");
                break;
            case 'C':
            case 'c':
                System.out.println("中等成绩");
                System.out.println("需要努力提升");
                break;
            case 'D':
            case 'd':
                System.out.println("及格成绩");
                System.out.println("建议加强学习");
                break;
            case 'F':
            case 'f':
                System.out.println("不及格");
                System.out.println("需要重修");
                break;
            default:
                System.out.println("无效等级: " + grade);
        }
    }

    public static void main(String[] args) {
        System.out.println("=== 月份天数计算 ===");
        System.out.println("1月天数: " + getDaysInMonth(1, false));
        System.out.println("2月天数(平年): " + getDaysInMonth(2, false));
        System.out.println("2月天数(闰年): " + getDaysInMonth(2, true));
        System.out.println("4月天数: " + getDaysInMonth(4, false));

        System.out.println("\n=== 工作日分类 ===");
        classifyDay(1);
        System.out.println();
        classifyDay(6);
        System.out.println();
        classifyDay(0);

        System.out.println("\n=== 成绩等级处理 ===");
        processGrade('A');
        System.out.println();
        processGrade('c');
        System.out.println();
        processGrade('X');
    }
}

枚举类型switch

enum Color {
    RED, GREEN, BLUE, YELLOW, ORANGE, PURPLE
}

enum Size {
    SMALL, MEDIUM, LARGE, EXTRA_LARGE
}

enum Direction {
    NORTH, SOUTH, EAST, WEST
}

public class EnumCaseExample {

    // 颜色处理
    public static void processColor(Color color) {
        switch (color) {
            case RED:
                System.out.println("红色 - 热情、活力");
                break;
            case GREEN:
                System.out.println("绿色 - 自然、和谐");
                break;
            case BLUE:
                System.out.println("蓝色 - 冷静、专业");
                break;
            case YELLOW:
                System.out.println("黄色 - 明亮、欢快");
                break;
            case ORANGE:
                System.out.println("橙色 - 温暖、创意");
                break;
            case PURPLE:
                System.out.println("紫色 - 神秘、高贵");
                break;
        }
    }

    // 尺寸价格计算
    public static double calculatePrice(Size size, double basePrice) {
        double multiplier;

        switch (size) {
            case SMALL:
                multiplier = 0.8;
                break;
            case MEDIUM:
                multiplier = 1.0;
                break;
            case LARGE:
                multiplier = 1.2;
                break;
            case EXTRA_LARGE:
                multiplier = 1.5;
                break;
            default:
                multiplier = 1.0;
        }

        return basePrice * multiplier;
    }

    // 方向移动
    public static void moveInDirection(Direction direction, int steps) {
        switch (direction) {
            case NORTH:
                System.out.println("向北移动 " + steps + " 步");
                break;
            case SOUTH:
                System.out.println("向南移动 " + steps + " 步");
                break;
            case EAST:
                System.out.println("向东移动 " + steps + " 步");
                break;
            case WEST:
                System.out.println("向西移动 " + steps + " 步");
                break;
        }
    }

    public static void main(String[] args) {
        System.out.println("=== 颜色处理 ===");
        processColor(Color.RED);
        processColor(Color.BLUE);
        processColor(Color.GREEN);

        System.out.println("\n=== 尺寸价格计算 ===");
        double basePrice = 100.0;
        for (Size size : Size.values()) {
            double price = calculatePrice(size, basePrice);
            System.out.println(size + " 尺寸价格: " + price);
        }

        System.out.println("\n=== 方向移动 ===");
        moveInDirection(Direction.NORTH, 5);
        moveInDirection(Direction.EAST, 3);
        moveInDirection(Direction.SOUTH, 2);
        moveInDirection(Direction.WEST, 4);
    }
}

实际应用场景

import java.time.DayOfWeek;
import java.time.LocalDate;

public class CaseApplications {

    // 计算器操作
    public static double calculate(double num1, double num2, char operator) {
        double result;

        switch (operator) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                if (num2 != 0) {
                    result = num1 / num2;
                } else {
                    throw new IllegalArgumentException("除数不能为0");
                }
                break;
            case '%':
                result = num1 % num2;
                break;
            case '^':
                result = Math.pow(num1, num2);
                break;
            default:
                throw new IllegalArgumentException("不支持的操作符: " + operator);
        }

        return result;
    }

    // 用户权限检查
    public static boolean checkPermission(String userRole, String action) {
        switch (userRole.toLowerCase()) {
            case "admin":
                // 管理员拥有所有权限
                return true;
            case "editor":
                switch (action.toLowerCase()) {
                    case "read":
                    case "write":
                    case "edit":
                    case "delete":
                        return true;
                    case "admin":
                        return false;
                    default:
                        return false;
                }
            case "author":
                switch (action.toLowerCase()) {
                    case "read":
                    case "write":
                    case "edit":
                        return true;
                    case "delete":
                    case "admin":
                        return false;
                    default:
                        return false;
                }
            case "viewer":
                switch (action.toLowerCase()) {
                    case "read":
                        return true;
                    case "write":
                    case "edit":
                    case "delete":
                    case "admin":
                        return false;
                    default:
                        return false;
                }
            case "guest":
                return action.toLowerCase().equals("read");
            default:
                return false;
        }
    }

    // 季节判断和活动推荐
    public static void recommendActivity(int month) {
        String season;
        String activity;

        switch (month) {
            case 12:
            case 1:
            case 2:
                season = "冬季";
                activity = "滑雪、温泉、室内运动";
                break;
            case 3:
            case 4:
            case 5:
                season = "春季";
                activity = "踏青、赏花、户外徒步";
                break;
            case 6:
            case 7:
            case 8:
                season = "夏季";
                activity = "游泳、海滩、避暑旅游";
                break;
            case 9:
            case 10:
            case 11:
                season = "秋季";
                activity = "登山、赏叶、户外摄影";
                break;
            default:
                season = "无效月份";
                activity = "请输入1-12的月份";
        }

        System.out.println("月份 " + month + " 属于 " + season);
        System.out.println("推荐活动: " + activity);
    }

    public static void main(String[] args) {
        System.out.println("=== 计算器操作 ===");
        try {
            System.out.println("10 + 5 = " + calculate(10, 5, '+'));
            System.out.println("10 - 3 = " + calculate(10, 3, '-'));
            System.out.println("4 * 6 = " + calculate(4, 6, '*'));
            System.out.println("15 / 3 = " + calculate(15, 3, '/'));
            System.out.println("2 ^ 3 = " + calculate(2, 3, '^'));
        } catch (IllegalArgumentException e) {
            System.out.println("计算错误: " + e.getMessage());
        }

        System.out.println("\n=== 权限检查 ===");
        String[] roles = {"admin", "editor", "author", "viewer", "guest"};
        String[] actions = {"read", "write", "delete", "admin"};

        for (String role : roles) {
            System.out.println(role.toUpperCase() + " 权限:");
            for (String action : actions) {
                boolean hasPermission = checkPermission(role, action);
                System.out.println("  " + action + ": " + (hasPermission ? "✓" : "✗"));
            }
            System.out.println();
        }

        System.out.println("=== 季节活动推荐 ===");
        recommendActivity(3);
        System.out.println();
        recommendActivity(7);
        System.out.println();
        recommendActivity(10);
        System.out.println();
        recommendActivity(13);
    }
}

最佳实践

public class CaseBestPractices {

    // 1. 总是使用break语句(除非确实需要fall-through)
    public static void goodBreakUsage(int option) {
        switch (option) {
            case 1:
                System.out.println("选项1");
                break; // 必须有break
            case 2:
                System.out.println("选项2");
                break; // 必须有break
            case 3:
                System.out.println("选项3");
                break; // 必须有break
            default:
                System.out.println("无效选项");
                // 最后一个case可以不要break,但建议加上
                break;
        }
    }

    // 2. 合理使用default案例
    public static void useDefaultProperly(String input) {
        switch (input) {
            case "yes":
            case "y":
            case "true":
                System.out.println("确认操作");
                break;
            case "no":
            case "n":
            case "false":
                System.out.println("取消操作");
                break;
            default:
                System.out.println("无效输入,请输入 yes 或 no");
                break;
        }
    }

    // 3. 使用枚举代替字符串常量
    enum Operation {
        ADD, SUBTRACT, MULTIPLY, DIVIDE
    }

    public static double performOperation(double a, double b, Operation op) {
        switch (op) {
            case ADD:
                return a + b;
            case SUBTRACT:
                return a - b;
            case MULTIPLY:
                return a * b;
            case DIVIDE:
                if (b != 0) {
                    return a / b;
                } else {
                    throw new IllegalArgumentException("除数不能为0");
                }
            default:
                throw new IllegalArgumentException("不支持的操作: " + op);
        }
    }

    // 4. 避免复杂的case逻辑
    public static void processComplexCase(int type) {
        switch (type) {
            case 1:
                handleType1();
                break;
            case 2:
                handleType2();
                break;
            case 3:
                handleType3();
                break;
            default:
                handleDefaultType();
                break;
        }
    }

    private static void handleType1() {
        System.out.println("处理类型1");
        // 复杂逻辑封装在独立方法中
    }

    private static void handleType2() {
        System.out.println("处理类型2");
        // 复杂逻辑封装在独立方法中
    }

    private static void handleType3() {
        System.out.println("处理类型3");
        // 复杂逻辑封装在独立方法中
    }

    private static void handleDefaultType() {
        System.out.println("处理默认类型");
    }

    public static void main(String[] args) {
        System.out.println("=== break使用 ===");
        goodBreakUsage(1);
        goodBreakUsage(5);

        System.out.println("\n=== default使用 ===");
        useDefaultProperly("yes");
        useDefaultProperly("invalid");

        System.out.println("\n=== 枚举操作 ===");
        System.out.println("5 + 3 = " + performOperation(5, 3, Operation.ADD));
        System.out.println("10 / 2 = " + performOperation(10, 2, Operation.DIVIDE));

        System.out.println("\n=== 复杂case处理 ===");
        processComplexCase(1);
        processComplexCase(2);
        processComplexCase(0);
    }
}

case关键字是switch语句的核心组成部分,合理使用能让多分支逻辑更清晰、更高效。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 16:25:54

results matching ""

    No results matching ""