Skip to content

流程控制

概述

流程控制决定程序执行哪一段代码、重复执行多少次。Java 提供两类机制:条件分支(根据条件选择不同分支)和循环(重复执行某段代码)。配合 运算符 中的关系与逻辑运算,即可实现复杂的业务逻辑。

本文介绍:if / else if / elseswitchfor、增强 for、whiledo-while,以及 breakcontinue 的用法与常见注意点。

前置建议

已掌握 变量与数据类型运算符,能写出结果为 boolean 的条件表达式。


条件分支:if / else if / else

根据条件为真或假,选择执行不同代码块。

基本语法

java
// 单分支:条件为 true 时执行
if (条件) {
    // 语句块
}

// 双分支
if (条件) {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}

// 多分支
if (条件1) {
    // ...
} else if (条件2) {
    // ...
} else {
    // 以上都不满足时执行
}

条件必须是 boolean 类型(或结果为 boolean 的表达式),不能像 C 语言那样用数字表示真假。

示例 1:单分支与双分支

java
int score = 85;
if (score >= 60) {
    System.out.println("及格");
}

int age = 16;
if (age >= 18) {
    System.out.println("成年");
} else {
    System.out.println("未成年");
}

示例 2:多分支与嵌套

java
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)

java
switch (表达式) {
    case 值1:
        // 语句
        break;
    case 值2:
        // 语句
        break;
    default:
        // 所有 case 都不匹配时执行
}
  • 表达式:JDK 7 以前只支持 byteshortintchar;JDK 7+ 支持 String;枚举也可作为 case。
  • break:跳出整个 switch,否则会穿透到下一个 case 继续执行(fall-through)。

示例:按星期输出

java
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 实现穿透:

java
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 简化写法,且不会意外穿透:

java
// 使用箭头语法,无需 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 适用于已知或可计算循环次数的情况,结构清晰。

基本语法

java
for (初始化; 条件; 更新) {
    // 循环体
}

执行顺序:① 初始化(只执行一次)→ ② 判断条件 → ③ 若为 true 执行循环体 → ④ 执行更新 → 回到 ②。

示例 1:固定次数

java
// 输出 1 到 5
for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}

示例 2:遍历数组(传统 for)

java
int[] arr = { 10, 20, 30 };
for (int i = 0; i < arr.length; i++) {
    System.out.println("索引 " + i + ":" + arr[i]);
}

增强 for(for-each)

不需要索引、只关心每个元素时,用 增强 for 更简洁:

java
int[] arr = { 10, 20, 30 };
for (int value : arr) {
    System.out.println(value);
}

语法:for (元素类型 变量 : 数组或可迭代对象) { }。在 数组集合 遍历中都会频繁使用。

提示

增强 for 中不能修改循环变量来改变数组或集合内容(对数组而言,修改的是局部副本或引用指向的对象内部);需要按索引修改时,用传统 for。


循环:while 与 do-while

while:先判断条件,再执行循环体;条件为 false 时一次也不执行。
do-while:先执行一次循环体,再判断条件;至少执行一次。

基本语法

java
// while:先判断后执行
while (条件) {
    // 循环体
}

// do-while:先执行后判断
do {
    // 循环体
} while (条件);

示例:while 与 do-while

java
// 求 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

java
// 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 标签名

java
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,代码更简洁。

相关链接

基于 VitePress 构建