Day7|Java的流程控制

lazysnail2025/07/10Java基础

在Java编程中,流程控制结构决定了程序如何执行分支判断、如何进行重复运算、如何根据状态做出不同选择,是构建逻辑的决策中枢。

本文将结合实战案例、行为对比和常见误区,系统讲解Java中的常用控制结构及其语义特性。

一、条件分支:程序的决策逻辑

条件控制就是让代码根据当前状态做出判断和选择。

就像你在路口,会根据红绿灯的状态(红黄绿)来决定走还是停。

1. if-else 结构

基础语法

if (条件1) {
    // 条件1为 true 时执行
} else if (条件2) {
    // 条件2为 true 时执行
} else {
    // 所有条件都不满足时执行
}

示例

int temperature = 28;
if (temperature > 30) {
    System.out.println("开启空调");
} else if (temperature < 10) {
    System.out.println("开启暖气");
} else {
    System.out.println("当前温度适宜");
}

建议及提示

// 示例中的代码你这样写也是能够正常编译,并且满足逻辑的
int temperature = 28;
if (temperature > 30)
    System.out.println("开启空调");
else if (temperature < 10)
    System.out.println("开启暖气");
else
    System.out.println("当前温度适宜");

// 区别就是条件语句之后的大括号都被去掉了
// 前提条件是条件语句之后只有一句代码

// 假如温度大于30度的时候,你不仅要开空调,还要打开加湿器,就会出现编译错误
int temperature = 28;
if (temperature > 30)
    System.out.println("开启空调");
    System.out.println("打开加湿器");
else if (temperature < 10)
    System.out.println("开启暖气");
else
    System.out.println("当前温度适宜");

TIP

尽量使用大括号{}把代码块包起来,提升可读性。

2. switch 结构

switch是基于值匹配的条件分支选择结构,适用于明确的分类判断场景。

你打电话给100XX的时候,对面的语音机器人给你说:1-话费查询、2-宽带咨询、3-故障报修、4-人工服务等等。

当你按下具体数字键后,就进入了具体的业务板块。

基本语法

switch (表达式) {
    case1:
        // 匹配值1时执行
        break;
    case2:
        // 匹配值2时执行
        break;
    default:
        // 无匹配时执行
}

示例

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("无效输入");
}

增强写法(箭头语法)

String result = switch (dayOfWeek) {
    case 1, 2, 3 -> "工作日";
    case 6, 7 -> "周末";
    default -> "未知";
};

建议及提示

switch中支持的表达式其实一直在演进,在具体开发的时候,要注意JDK的版本。

版本特性代码示例
Java 5支持枚举case MONDAY: ...
Java 7支持字符串case "Apple": ...
Java 12箭头语法、多值匹配case 1, 2 -> "Winter"
Java 13yield 返回值case 404 -> { ... yield "Not Found"; }
Java 14正式标准化无需预览标志
Java 17模式匹配(类型+条件)case String s && !s.isEmpty() -> ...
Java 21记录模式、泛型模式case Point(int x, int y) -> ...

刚开始使用switch的时候,如果使用的是早期JDK版本,还容易遇到穿透问题。

int day = 2;
switch (day) {
    case 1:
        System.out.println("星期一");
    case 2:
        System.out.println("星期二"); // 原本想输出的
    case 3:
        System.out.println("星期三"); // 实际这里也输出了(穿透)
}
// 本来想输出的是"星期二"

// 实际的输出却是星期二 星期三
// 主要是没有加上break语句

当某个case分支没有使用break语句时,程序会继续执行后续的case代码,直到遇到break或switch结束。

二、循环控制:让程序自动重复

当你需要让某些操作不断执行,直到满足某个条件,就需要使用循环控制结构。

想一下你家的洗衣机,当你按下开关,中间大部分时间是不是都是滚筒在正转、反转不停的重复,直到到时间(或者其条件)才不再循环去干其他事情。

1. for 循环(固定次数)

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

TIP

示例代码中有了很多Java的运算符的使用,如果不熟悉可以回看下Day5 | Java运算符与表达式详解open in new window

避免死循环

while (true) {
    // 做点什么
}

for (;;) {
    // 做点什么
}
// 没有明确退出的条件,程序将一直运行(循环)下去
// 你可以把上面两段代码拷贝到IDEA中运行一下,除非你手动终止程序的运行,否则它将一直运行下去

TIP

在实际开发中,特别是对于刚接触编程,对于死循环的应用要慎重!

JDK源码中确实也存在一些死循环的形式,所以也不要过于妖魔化死循环。

重要的还是把握使用场景及退出的机制。

img

2. while 循环(条件型)

while在每次执行前判断条件,适合不知道执行几次的场景。

Scanner scanner = new Scanner(System.in);
int input;
System.out.print("请输入1~100之间的数字:");
while (true) {
    input = scanner.nextInt();
    if (input >= 1 && input <= 100) break;
    System.out.print("输入无效,请重新输入:");
}

3. do-while 循环(至少执行一次)

do-while先执行,再判断是否继续,适合至少执行一次的场景。

int choice;
do {
    System.out.println("1. 开始游戏\n2. 加载存档\n3. 退出");
    choice = scanner.nextInt();
} while (choice < 1 || choice > 3);

4. for-each 循环(增强型)

for-each用于遍历集合或数组,语法更简洁,强调遍历而不是控制。

int[] arr = {1, 2, 3};
for (int num : arr) {
    System.out.println(num);
}

TIP

for-each背后其实是Iterator(迭代器),后续讲到集合再聊。

三、循环控制关键字

循环过程中,我们常常需要提前退出或跳过某次,这就用到了这些控制语句。

1. break:立即终止整个循环

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        System.out.println("找到:" + i);
        break;
    }
}

当进入if语句后,输出完,碰到break,后续的循环就不会再执行了(1-10中第一个满足i %3==0条件找到了,整个循环就结束)

2. continue:跳过当前这次循环

for (int i = 1; i <= 5; i++) {
    if (i == 3) continue;
    System.out.println(i);
}

continue直译过来就是继续的意思。当碰到满足i == 3时,后面的输出就不执行了,直接进行下一次循环。

3. return:退出整个方法

public void check(int num) {
    if (num < 0) return;
    System.out.println("有效数字");
}

TIP

严格意义上讲return关键字不算循环控制的关键字,但是它的行为可能会影响循环的执行流程。所以这里提一嘴。 return的主要作用是从方法中返回一个值(如果有返回值) 再者就是终止方法的执行(不管是不是在循环里)

public static void main(String[] args) {
    while (true) {
        return;
    }
}
// 即使是个死循环,碰到了return也结束

四、结构与语义对比

下面梳理一下各种流程控制结构的特性

结构适合场景判断点位置可读性
if-else条件判断,灵活分支语句前
switch离散枚举、菜单选择语句前
for明确次数的迭代语句前
while条件不定,未知次数语句前
do-while必须先执行再判断语句后

五、练一练吧

先看懂1,再动手写一下2,基于前6天讲的内容,至少应该能够在main方法中写出乘法表的大致逻辑

1.九九乘法表

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();
}

2.简易命令行计算器(结合循环 + switch)

结语

流程控制语法的掌握,是编程真正通人性的第一步。

其实设计这些流程控制结构,完全可以投射到现实生活中,用现实生活来套这些结构就比较容易理解了。

  • if-else负责决策
  • switch提高结构化
  • for/while驱动自动行为

这些控制结构虽然语法简单,但逻辑无限强大。

就跟现实生活中你离不开选择判断、离不开重复(循环)一样,程序(项目)也离不开这些控制结构。

最后更新 7/10/2025, 11:14:05 AM