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语句的核心组成部分,合理使用能让多分支逻辑更清晰、更高效。