在 Java 编程中,switch 语句是一种非常实用的流程控制结构,常用于处理多个固定值的条件判断。与 if-else 语句相比,switch 更加简洁、清晰,尤其适合处理枚举、整型、字符串等具有固定值集合的判断场景。随着 Java 版本的演进,switch 语句在 Java 12 引入表达式写法后,变得更加灵活和强大。本文将详细解析 Java 中 switch 语句的基本用法、语法结构、新特性以及实际应用技巧,帮助开发者更好地掌握这一常用控制结构。
switch 语句的基本语法如下:
switch (表达式) {
case 值1:
// 代码块1
break;
case 值2:
// 代码块2
break;
...
default:
// 默认代码块
}
表达式:必须是一个可枚举的类型,如 byte、short、int、char、String 和 enum;
case 后的值必须是常量,不能是变量或表达式;
default 是可选的,用于处理未匹配到任何 case 的情况;
break 用于跳出当前分支,避免“穿透”现象(fall-through)。
示例:
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他");
}
该示例输出:星期三
Java 中的 switch 语句对数据类型有严格的限制,仅支持以下类型:
基本数据类型:byte、short、int、char;
封装类型:Byte、Short、Integer、Character;
字符串类型(Java 7 开始支持):String 类型可以用于 switch 条件判断;
枚举类型(Java 5 开始支持):枚举是 switch 的理想搭配,逻辑清晰,可读性高。
示例(字符串):
String fruit = "apple";
switch (fruit) {
case "apple":
System.out.println("苹果");
break;
case "banana":
System.out.println("香蕉");
break;
default:
System.out.println("未知水果");
}
示例(枚举):
enum Day { MONDAY, TUESDAY, WEDNESDAY }
public class Test {
public static void main(String[] args) {
Day day = Day.WEDNESDAY;
switch (day) {
case MONDAY:
System.out.println("周一");
break;
case TUESDAY:
System.out.println("周二");
break;
case WEDNESDAY:
System.out.println("周三");
break;
}
}
}
switch 语句的执行流程如下:
首先计算 switch 括号中的表达式;
然后从 case 中查找匹配的值;
如果找到匹配项,执行对应的代码块;
如果没有 break,程序会继续执行后续的 case,这就是“穿透”现象;
如果没有匹配项,则执行 default 分支(如果存在)。
常见注意事项:
不要忘记写 break
如果没有 break,程序会继续执行后续 case 中的代码,导致逻辑错误。
int num = 1;
switch (num) {
case 1:
System.out.println("值为1");
case 2:
System.out.println("值为2");
}
输出:
值为1
值为2
因为缺少 break,程序会继续执行后续分支。
case 后必须是常量
case 后面的值必须是编译时常量,不能是变量或运行时计算的值。
final int VALUE = 10;
switch (num) {
case VALUE: // 正确,因为是 final 常量
...
}
default 分支是可选的
虽然 default 不是必须的,但建议始终添加,以应对未匹配的情况。
允许多个 case 共用一个代码块
如果多个 case 执行相同的逻辑,可以合并写法:
switch (num) {
case 1:
case 2:
case 3:
System.out.println("1-3");
break;
default:
System.out.println("其他");
}
注意空指针异常
当使用 String 类型作为 switch 条件时,如果字符串为 null,会抛出 NullPointerException,因此应先进行非空判断。
String fruit = null;
switch (fruit) { // 抛出 NullPointerException
...
}
case 值不能重复
同一个 switch 语句中,case 的值必须唯一,否则编译错误。
case 值不能是范围
switch 不支持写如 case 1..5: 这样的范围写法,需手动判断。
从 Java 12 开始,switch 语句引入了新的表达式写法,支持使用 -> 语法,使代码更加简洁,且支持返回值。
新写法示例:
int day = 3;
String result = switch (day) {
case 1 -> "周一";
case 2 -> "周二";
case 3 -> "周三";
default -> "未知";
};
System.out.println(result); // 输出:周三
新特性优势:
语法更简洁:使用 -> 代替 case 和 break;
支持返回值:可以作为表达式返回值;
防止穿透:每个 case 独立执行,避免误写 break;
支持 throw 语句:可以在 switch 表达式中抛出异常;
新写法示例(带返回值):
int score = 85;
String grade = switch (score / 10) {
case 9, 10 -> "A";
case 8 -> "B";
case 7 -> "C";
default -> "D";
};
System.out.println(grade); // 输出:B
根据枚举进行逻辑判断
switch 与枚举结合使用,是 Java 中最推荐的用法之一,代码清晰、可读性强。
实现菜单选择功能
在控制台程序或简单 UI 中,switch 常用于实现菜单逻辑:
char choice = 'B';
switch (choice) {
case 'A':
System.out.println("新增");
break;
case 'B':
System.out.println("编辑");
break;
case 'C':
System.out.println("删除");
break;
default:
System.out.println("无效操作");
}
处理 HTTP 状态码或错误码
在网络编程中,switch 可用于处理不同的状态码:
int statusCode = 404;
switch (statusCode) {
case 200:
System.out.println("请求成功");
break;
case 404:
System.out.println("资源未找到");
break;
default:
System.out.println("其他错误");
}
实现状态机逻辑
在业务逻辑中,如订单状态流转、任务状态管理等,switch 语句可以清晰表达状态判断:
String status = "processing";
switch (status) {
case "pending":
System.out.println("等待处理");
break;
case "processing":
System.out.println("处理中");
break;
case "completed":
System.out.println("已完成");
break;
default:
System.out.println("未知状态");
}
简化 if-else 判断
当有多个离散的条件判断时,使用 switch 可以提高代码可读性,减少 if-else 嵌套。
配合枚举实现策略模式
switch 与枚举结合,可以实现简单的策略模式:
enum Operation {
ADD, SUBTRACT, MULTIPLY, DIVIDE;
}
double calculate(Operation op, double a, double b) {
return switch (op) {
case ADD -> a + b;
case SUBTRACT -> a - b;
case MULTIPLY -> a * b;
case DIVIDE -> a / b;
};
}
switch 语句是 Java 中处理多条件分支的重要工具,其语法简洁、结构清晰,特别适合用于处理枚举、整型、字符串等具有固定值的条件判断。从 Java 12 开始,switch 引入了表达式写法,进一步提升了其灵活性和可读性。
声明:所有来源为“澳门太阳集团城网址8722”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
通过出发地、目的地、出发日期等信息查询航班信息。
通过站到站查询火车班次时刻表等信息,同时已集成至太阳集团城8722MCP Server。火车票订票MCP不仅能赋予你的Agent火车时刻查询,还能支持在线订票能力。
通过车辆vin码查询车辆的过户次数等相关信息
验证银行卡、身份证、姓名、手机号是否一致并返回账户类型
查询个人是否存在高风险行为