Skip to content

流程控制

流程控制是编程语言中用于控制程序执行顺序的机制。Java 提供了多种流程控制语句,包括条件语句和循环语句。

条件语句

条件语句根据条件的真假来决定执行哪段代码。

if-else 语句

基本 if 语句

java
if (条件表达式) {
    // 条件为真时执行的代码块
}

if-else 语句

java
if (条件表达式) {
    // 条件为真时执行的代码块
} else {
    // 条件为假时执行的代码块
}

嵌套 if-else 语句

java
if (条件表达式1) {
    // 条件1为真时执行的代码块
} else if (条件表达式2) {
    // 条件1为假但条件2为真时执行的代码块
} else {
    // 所有条件都为假时执行的代码块
}

示例

java
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("不及格");
}

switch 语句

switch 语句用于多分支选择,根据表达式的值选择执行对应的 case 分支。

基本语法

java
switch (表达式) {
    case 值1:
        // 表达式等于值1时执行的代码
        break;
    case 值2:
        // 表达式等于值2时执行的代码
        break;
    // 更多 case 分支...
    default:
        // 表达式不匹配任何 case 时执行的代码
}

注意事项

  • 表达式可以是 byte、short、int、char、枚举类型或 String 类型(Java 7 及以上)
  • case 标签必须是常量表达式
  • 如果没有 break 语句,程序会继续执行下一个 case 的代码(穿透现象)
  • default 分支是可选的,当没有匹配的 case 时执行

示例

java
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':
    case 'F':
        System.out.println("不及格");
        break;
    default:
        System.out.println("成绩无效");
}

Java 14 增强的 switch 表达式(预览功能)

java
String day = "MONDAY";

String result = switch (day) {
    case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "工作日";
    case "SATURDAY", "SUNDAY" -> "周末";
    default -> "无效的星期";
};

System.out.println(result); // 输出: 工作日

循环语句

循环语句用于重复执行一段代码,直到满足特定条件。

for 循环

基本 for 循环

java
for (初始化; 循环条件; 迭代) {
    // 循环体,重复执行的代码
}
  • 初始化:在循环开始前执行一次,通常用于声明和初始化循环变量
  • 循环条件:每次循环开始前检查,为 true 时执行循环体,为 false 时结束循环
  • 迭代:每次循环体执行完后执行,通常用于更新循环变量

示例

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

// 计算 1 到 100 的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
System.out.println("1 到 100 的和为: " + sum);

增强 for 循环(for-each)

用于遍历数组或集合中的元素。

java
for (元素类型 变量名 : 数组或集合) {
    // 循环体,变量名表示当前元素
}

示例

java
// 遍历数组
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
    System.out.println(num);
}

// 遍历字符串
String message = "Hello";
for (char c : message.toCharArray()) {
    System.out.println(c);
}

while 循环

while 循环在循环条件为 true 时重复执行循环体。

基本语法

java
while (循环条件) {
    // 循环体
    // 注意:需要有使循环条件变为 false 的语句,否则会导致死循环
}

示例

java
// 输出 1 到 10
int i = 1;
while (i <= 10) {
    System.out.println(i);
    i++; // 递增循环变量,避免死循环
}

// 计算 1 到 100 的乘积
long product = 1;
i = 1;
while (i <= 100) {
    product *= i;
    i++;
}
System.out.println("1 到 100 的乘积为: " + product);

do-while 循环

do-while 循环至少执行一次循环体,然后在循环条件为 true 时继续执行。

基本语法

java
do {
    // 循环体
} while (循环条件);

示例

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

// 读取用户输入,直到输入有效的数字
Scanner scanner = new Scanner(System.in);
int number;
do {
    System.out.print("请输入一个正整数: ");
    number = scanner.nextInt();
} while (number <= 0);
System.out.println("你输入的数字是: " + number);
scanner.close();

跳转语句

跳转语句用于改变程序的执行流程。

break 语句

break 语句用于:

  1. 终止 switch 语句中的 case
  2. 退出当前循环

示例

java
// 在循环中使用 break
for (int i = 1; i <= 10; i++) {
    if (i == 6) {
        break; // 当 i 等于 6 时,跳出循环
    }
    System.out.println(i);
}

// 输出:1 2 3 4 5

// 在嵌套循环中使用 break(只跳出内层循环)
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            break;
        }
        System.out.println("i=" + i + ", j=" + j);
    }
}

continue 语句

continue 语句用于跳过当前循环的剩余部分,直接进入下一次循环。

示例

java
// 输出 1 到 10 之间的奇数
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue; // 跳过偶数
    }
    System.out.println(i);
}

// 输出:1 3 5 7 9

// 在 while 循环中使用 continue
int i = 0;
while (i < 10) {
    i++;
    if (i % 3 == 0) {
        continue;
    }
    System.out.println(i);
}

return 语句

return 语句用于:

  1. 结束当前方法的执行
  2. 返回方法的结果(如果方法有返回值)

示例

java
// 返回方法结果
public int add(int a, int b) {
    return a + b;
}

// 提前结束方法
public void checkNumber(int number) {
    if (number < 0) {
        System.out.println("负数");
        return; // 提前结束方法
    }
    System.out.println("非负数: " + number);
}

流程控制语句的嵌套

流程控制语句可以相互嵌套,形成复杂的控制结构。

嵌套循环

一个循环可以包含另一个循环。

示例

java
// 打印九九乘法表
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(j + "×" + i + "=" + (i * j) + "\t");
    }
    System.out.println();
}

// 查找二维数组中的最大值
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
int max = matrix[0][0];
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        if (matrix[i][j] > max) {
            max = matrix[i][j];
        }
    }
}
System.out.println("最大值: " + max);

条件语句嵌套

if 语句可以嵌套在另一个 if 语句中。

示例

java
// 根据分数和出勤率判断是否通过课程
int score = 75;
double attendance = 0.85;

if (attendance >= 0.75) {
    if (score >= 60) {
        System.out.println("通过课程");
    } else {
        System.out.println("成绩不达标,未通过");
    }
} else {
    System.out.println("出勤率不足,未通过");
}

常见错误与注意事项

  1. 死循环:循环条件永远为 true,导致循环无法结束

    • 解决方法:确保循环条件最终会变为 false
  2. 循环变量未更新:在循环体中忘记更新循环变量

    • 例如:while (i < 10) { System.out.println(i); } // 缺少 i++
  3. switch 语句缺少 break:导致 case 穿透

    • 解决方法:在每个 case 结束时添加 break 语句
  4. 作用域问题:在循环外部访问循环内部声明的变量

    • 解决方法:在需要的作用域内声明变量
  5. 浮点数比较:使用 == 比较浮点数可能导致不准确的结果

    • 解决方法:使用差值小于某个很小的值(如 1e-6)来判断相等

小结

  • 条件语句:if-else 和 switch 用于根据条件选择执行路径
  • 循环语句:for、while 和 do-while 用于重复执行代码块
  • 跳转语句:break、continue 和 return 用于改变程序执行流程
  • 嵌套结构:流程控制语句可以相互嵌套,形成复杂的控制逻辑
  • 注意事项:避免死循环、确保循环变量正确更新、正确使用 break 语句等

通过掌握这些流程控制语句,你可以编写出具有复杂逻辑的 Java 程序,实现各种功能需求。