01_条件语句(if-else switch-case)
一、条件语句概述
条件语句是程序控制流的核心组成部分,用于根据不同条件执行不同的代码块。Java 提供两种主要的条件语句:
- if-else 语句:基于布尔表达式的真假进行分支判断,灵活性高
- switch-case 语句:基于变量的值进行多分支匹配,适合固定值判断
合理使用条件语句可以让程序根据不同场景做出响应,实现复杂的业务逻辑。
二、if-else 语句
2.1 基本语法
if-else 语句有三种形式:单分支 if、双分支 if-else、多分支 if-else if-else。
单分支 if
if (条件表达式) {
// 条件为true时执行的代码块
}
双分支 if-else
if (条件表达式) {
// 条件为true时执行
} else {
// 条件为false时执行
}
多分支 if-else if-else
if (条件1) {
// 条件1为true时执行
} else if (条件2) {
// 条件1为false且条件2为true时执行
} else if (条件3) {
// 前面条件都为false且条件3为true时执行
} else {
// 所有条件都为false时执行(可选)
}
2.2 执行流程
以多分支为例,执行流程为:
- 依次判断条件 1、条件 2、条件 3...
- 第一个为 true 的条件对应的代码块会被执行
- 执行后跳出整个 if-else 结构,后续条件不再判断
- 若所有条件都为 false,执行 else 代码块(若存在)
2.3 代码示例
// 单分支示例:判断是否成年
int age = 18;
if (age >= 18) {
System.out.println("已成年");
}
// 双分支示例:判断奇偶
int num = 7;
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
// 多分支示例:成绩评级
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
2.4 注意事项
- 条件表达式必须是 boolean 类型
// 错误示例:条件表达式是int类型
if (10) { ... } // 编译错误
// 正确示例:条件表达式是boolean类型
if (10 > 5) { ... } // 正确
- 代码块的省略与风险
当代码块只有一行语句时,可省略{},但建议始终保留以避免逻辑错误:
// 不推荐:易误解执行范围
if (score >= 60)
System.out.println("及格");
System.out.println("继续努力"); // 无论条件是否成立都会执行
// 推荐:明确代码块范围
if (score >= 60) {
System.out.println("及格");
System.out.println("继续努力");
}
- 悬空 else 问题
else 始终与最近的未配对 if 匹配:
// 容易误解的写法
if (a > b)
if (b > c)
System.out.println("a > b > c");
else // 实际与内层if配对
System.out.println("a <= b");
// 清晰的写法
if (a > b) {
if (b > c) {
System.out.println("a > b > c");
}
} else {
System.out.println("a <= b");
}
三、switch-case 语句
3.1 基本语法
switch-case 用于基于变量的离散值进行多分支判断,语法:
switch (表达式) {
case 值1:
// 表达式等于值1时执行
break; // 可选,用于跳出switch
case 值2:
// 表达式等于值2时执行
break;
// ... 更多case
default:
// 所有case都不匹配时执行(可选)
}
3.2 执行流程
执行流程:
- 计算 switch 后表达式的值(类型有限制)
- 依次与 case 后的值比较,寻找匹配的 case
- 执行匹配 case 后的代码,直到遇到 break 或 switch 结束
- 若没有匹配的 case,执行 default 代码块(若存在)
3.3 表达式类型与 case 值要求
支持的表达式类型
- 基本类型:byte、short、int、char
- 包装类型:Byte、Short、Integer、Character
- 枚举类型(JDK 5+)
- 字符串类型(JDK 7+)
case 值要求
- 必须是常量或常量表达式(如10、'A'、"abc")
- 不能重复(同一 switch 中 case 值唯一)
- 类型必须与 switch 表达式类型兼容
3.4 代码示例
// 整数类型示例
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("未知星期");
}
// 字符串类型示例(JDK 7+)
String season = "spring";
switch (season) {
case "spring":
System.out.println("春天");
break;
case "summer":
System.out.println("夏天");
break;
default:
System.out.println("其他季节");
}
// 省略break的穿透效果
int month = 2;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
// ... 其他季节
}
3.5 注意事项
- break 的作用:没有 break 会导致 case 穿透(继续执行下一个 case 的代码)
int num = 2;
switch (num) {
case 1:
System.out.println("1");
case 2:
System.out.println("2"); // 执行
case 3:
System.out.println("3"); // 穿透执行
break;
default:
System.out.println("default");
}
// 输出:2 3
- default 的位置:default 可放在任意位置,不影响 case 匹配,但通常放在最后
switch (num) {
default:
System.out.println("default");
break;
case 1:
System.out.println("1");
}
- 字符串 case 的性能:字符串 switch 本质是通过 hashCode 和 equals 实现,性能略低于整数 switch
四、if-else 与 switch-case 的对比
| 特性 | if-else | switch-case |
|---|---|---|
| 判断依据 | 布尔表达式(可复杂) | 变量值(离散值) |
| 分支数量 | 适合任意数量分支 | 适合多分支(3 个以上更具优势) |
| 灵活性 | 高(支持范围、逻辑组合等) | 低(仅支持等值匹配) |
| 执行效率 | 分支越多效率可能越低(依次判断) | 效率较高(通过跳转表实现) |
| 适用场景 | 范围判断、复杂逻辑组合 | 固定值匹配(如菜单选择、状态码) |
4.1 选择建议
- 当判断条件是范围或复杂逻辑时,用 if-else:
// 适合if-else:范围判断
if (score >= 0 && score <= 100) { ... }
- 当判断条件是多个离散值时,用 switch-case:
// 适合switch-case:固定值匹配
switch (statusCode) {
case 200: ...; break;
case 404: ...; break;
case 500: ...; break;
}
五、常见错误与最佳实践
5.1 常见错误
- if-else 的条件顺序错误
// 错误示例:条件1包含条件2,条件2永远不会执行
if (score >= 60) {
System.out.println("及格");
} else if (score >= 80) {
System.out.println("良好"); // 永远不会执行
}
解决方案:按条件范围从大到小或从小到大排序
// 正确:从高到低排序
if (score >= 80) { ... }
else if (score >= 60) { ... }
- switch-case 缺少 break 导致穿透
// 错误示例:缺少break导致错误输出
switch (num) {
case 1:
System.out.println("1");
case 2:
System.out.println("2");
}
// 当num=1时,输出"1 2"(非预期)
解决方案:每个 case 后添加 break(除了有意利用穿透的场景)
- 过度嵌套导致可读性差
// 不推荐:嵌套过深
if (a > b) {
if (b > c) {
if (c > d) {
// ...
}
}
}
解决方案:合并条件或提取为方法
// 推荐:合并条件
if (a > b && b > c && c > d) {
// ...
}
5.2 最佳实践
- 保持分支互斥:确保分支条件不重叠,避免逻辑混乱
- 控制嵌套深度:嵌套不超过 3 层,超过则拆分代码
- 优先使用常量:switch 的 case 值使用常量定义,提高可维护性
public static final int STATUS_OK = 200;
public static final int STATUS_ERROR = 500;
switch (status) {
case STATUS_OK: ...; break;
case STATUS_ERROR: ...; break;
}
- default 分支处理:始终添加 default 分支处理异常情况(除非确定所有情况都被覆盖)
六、总结
Java 条件语句是控制程序流程的核心工具:
- if-else通过布尔表达式实现灵活的分支判断,适合范围和复杂逻辑
- switch-case通过离散值实现多分支匹配,适合固定值判断
- 合理选择条件语句类型可提高代码可读性和效率
- 注意条件顺序、break 使用和嵌套深度,避免常见逻辑错误
掌握条件语句的使用是编写逻辑清晰、可靠程序的基础,在实际开发中需根据具体场景选择合适的条件控制结构。

浙公网安备 33010602011771号