流程控制
概述
流程控制决定程序执行哪一段代码、重复执行多少次。Java 提供两类机制:条件分支(根据条件选择不同分支)和循环(重复执行某段代码)。配合 运算符 中的关系与逻辑运算,即可实现复杂的业务逻辑。
本文介绍:if / else if / else、switch、for、增强 for、while、do-while,以及 break、continue 的用法与常见注意点。
条件分支:if / else if / else
根据条件为真或假,选择执行不同代码块。
基本语法
// 单分支:条件为 true 时执行
if (条件) {
// 语句块
}
// 双分支
if (条件) {
// 条件为 true 时执行
} else {
// 条件为 false 时执行
}
// 多分支
if (条件1) {
// ...
} else if (条件2) {
// ...
} else {
// 以上都不满足时执行
}条件必须是 boolean 类型(或结果为 boolean 的表达式),不能像 C 语言那样用数字表示真假。
示例 1:单分支与双分支
int score = 85;
if (score >= 60) {
System.out.println("及格");
}
int age = 16;
if (age >= 18) {
System.out.println("成年");
} else {
System.out.println("未成年");
}示例 2:多分支与嵌套
int score = 78;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}提示
多分支时,条件按书写顺序依次判断,第一个为 true 的分支会执行并结束整个 if。把更严格、更特殊的情况写在前面,可避免逻辑错误(例如先判断 score >= 90 再判断 score >= 80)。
条件分支:switch
当需要根据一个变量或表达式的值在多个固定取值之间做分支时,switch 比多重 if-else 更清晰。
基本语法(传统 switch)
switch (表达式) {
case 值1:
// 语句
break;
case 值2:
// 语句
break;
default:
// 所有 case 都不匹配时执行
}- 表达式:JDK 7 以前只支持
byte、short、int、char;JDK 7+ 支持String;枚举也可作为 case。 - break:跳出整个 switch,否则会穿透到下一个 case 继续执行(fall-through)。
示例:按星期输出
int dayOfWeek = 3;
switch (dayOfWeek) {
case 1:
System.out.println("周一");
break;
case 2:
System.out.println("周二");
break;
case 3:
System.out.println("周三");
break;
default:
System.out.println("无效");
}有意穿透(fall-through)
多个 case 共享同一段逻辑时,可以省略 break 实现穿透:
int level = 2;
switch (level) {
case 1:
case 2:
System.out.println("初级");
break;
case 3:
System.out.println("高级");
break;
default:
System.out.println("未知");
}注意
忘记写 break 会导致意外穿透,是 switch 中最常见的 bug。除有意合并 case 外,每个 case 末尾都应写 break(或 return)。
switch 表达式(JDK 14+)
JDK 14 起可使用 switch 表达式,用 -> 和 yield 简化写法,且不会意外穿透:
// 使用箭头语法,无需 break
int dayOfWeek = 3;
String dayName = switch (dayOfWeek) {
case 1 -> "周一";
case 2 -> "周二";
case 3 -> "周三";
case 4 -> "周四";
case 5 -> "周五";
default -> "周末或无效";
};
System.out.println(dayName); // 周三版本说明
switch 表达式(->、yield)自 JDK 14 作为正式特性提供;JDK 12/13 中为预览特性。若项目使用 JDK 8 或 11,请使用传统 switch + break 写法。
循环:for
for 适用于已知或可计算循环次数的情况,结构清晰。
基本语法
for (初始化; 条件; 更新) {
// 循环体
}执行顺序:① 初始化(只执行一次)→ ② 判断条件 → ③ 若为 true 执行循环体 → ④ 执行更新 → 回到 ②。
示例 1:固定次数
// 输出 1 到 5
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}示例 2:遍历数组(传统 for)
int[] arr = { 10, 20, 30 };
for (int i = 0; i < arr.length; i++) {
System.out.println("索引 " + i + ":" + arr[i]);
}增强 for(for-each)
不需要索引、只关心每个元素时,用 增强 for 更简洁:
int[] arr = { 10, 20, 30 };
for (int value : arr) {
System.out.println(value);
}语法:for (元素类型 变量 : 数组或可迭代对象) { }。在 数组 和 集合 遍历中都会频繁使用。
提示
增强 for 中不能修改循环变量来改变数组或集合内容(对数组而言,修改的是局部副本或引用指向的对象内部);需要按索引修改时,用传统 for。
循环:while 与 do-while
while:先判断条件,再执行循环体;条件为 false 时一次也不执行。
do-while:先执行一次循环体,再判断条件;至少执行一次。
基本语法
// while:先判断后执行
while (条件) {
// 循环体
}
// do-while:先执行后判断
do {
// 循环体
} while (条件);示例:while 与 do-while
// 求 1+2+...+10
int sum = 0;
int i = 1;
while (i <= 10) {
sum += i;
i++;
}
System.out.println("sum = " + sum); // 55
// do-while:至少执行一次
int n = 0;
do {
System.out.println("n = " + n);
n++;
} while (n < 3);注意
确保循环条件在某一时刻会变为 false,否则会形成死循环。尤其是 while,若条件一开始就永远为 true 且循环体内没有 break 或能改变条件的逻辑,程序将无法结束。
break 与 continue
- break:跳出当前循环或 switch,不再执行该层剩余循环。
- continue:跳过本次循环剩余语句,直接进入下一次循环判断。
示例:break 与 continue
// break:找到目标后立即退出循环
int[] arr = { 3, 7, 2, 9, 5 };
for (int x : arr) {
if (x == 9) {
System.out.println("找到 9");
break;
}
}
// continue:只处理正数
for (int i = 0; i < 5; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数,不执行下面的打印
}
System.out.println("奇数:" + i);
}带标签的 break(少见)
在嵌套循环中,若要从内层直接跳出外层,可给外层循环加标签,再用 break 标签名:
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
System.out.println("从内层跳出到 outer");
break outer;
}
}
}实际开发中多数情况可通过提取方法或布尔变量避免标签,按需使用即可。
注意事项
注意
- if / switch:条件必须是 boolean(或结果为 boolean);switch 的 case 值类型要与表达式类型一致,且注意 break 防止穿透。
- for / while:避免死循环,确保条件或循环体内逻辑能使循环结束;循环变量若在循环外还要使用,不要在 for 的「初始化」里声明(否则作用域仅限 for 内)。
提示
- 分支多且为固定取值时优先考虑 switch;需要区间或复杂条件时用 if-else。
- 已知次数或需要索引时用 for;「先判断再执行」用 while,「至少执行一次」用 do-while。
- 遍历数组或集合且不需要改索引时,优先用增强 for,代码更简洁。
相关链接
- 变量与数据类型 — 条件与循环中常用到的类型与变量
- 运算符 — 关系与逻辑运算符用于构造条件
- 数组 — 结合 for 与增强 for 遍历数组
- Oracle Java 教程 - 流程控制