05-告别逻辑混乱!Java 流程控制让代码学会"判断和循环"

🔥 前言

"学 Java 的时候,我一直以为流程控制就是简单的 if 和 for,直到写了一个复杂的业务逻辑,才发现代码变得越来越混乱,到处都是嵌套的条件和循环,根本无法维护。"

今天这篇,我把 Java 流程控制一次性讲清楚,都是我亲测过的经验教训,帮你彻底告别逻辑混乱的代码。


📌 本文你将获得:

  • 流程控制三大结构的完整用法(顺序、分支、循环)
  • if、switch、for、while、do-while 语句的详细语法与应用场景
  • 循环嵌套、break/continue 标号技术的实战技巧
  • Random 类生成随机数的方法与猜数字游戏案例
  • 常见流程控制错误与避坑指南

👋 关于作者

我是木圭,正在学习AI 智能应用开发 ,这是我从 0 开始系统学习 Java 的第 4 篇笔记。

我会持续记录从 0 基础到能独立开发 AI 应用的完整过程,包括学习笔记、项目实战、避坑指南。
关注我,一起见证从小白到开发者的成长之路!

📅 学习进度:第 4 天 | JavaSE 基础阶段(共 17 篇,已完结 5 篇)


一、【核心概念/问题引入】

1.1 先搞懂核心:流程控制到底是什么?

把流程控制比作交通信号灯,一秒就懂了:

  • 顺序结构:正常的绿灯,车辆按顺序通行
  • 分支结构:路口的红绿灯,根据信号选择不同方向
  • 循环结构:环岛,车辆绕圈行驶直到离开

官方定义是:流程控制语句是用来控制程序执行流程的语句,通过这些语句,程序可以根据不同的条件执行不同的代码,或者重复执行某段代码。

1.2 为什么需要流程控制?

  • 没有流程控制:代码只能从上到下顺序执行,无法根据条件做出判断,无法重复执行代码,无法实现复杂的业务逻辑
  • 有了流程控制:程序可以根据不同情况做出不同反应,实现复杂的业务逻辑,代码更加灵活和强大

二、【核心知识点详解】

2.1 分支语句

2.1.1 if 语句

是什么:if 语句是最基本的分支语句,用于根据条件执行不同的代码块。

怎么用

  • 第一种格式:if(条件表达式){ 语句体 }
  • 第二种格式:if(条件表达式){ 语句体1 }else { 语句体2 }
  • 第三种格式:if(条件表达式1){ 语句体1 }else if(条件表达式2){ 语句体2 }...else { 语句体n+1 }

注意事项

  • if 语句中,如果大括号控制的是一条语句,大括号可以省略不写,但不建议省略
  • if 语句的 ( ) 和 { } 之间不要写分号
  • if 语句的 ( ) 中需要产生 boolean 类型的结果

代码示例

java 复制代码
public static void ifDemo1() {
    System.out.println("----开始----");
    System.out.println("if的第一种格式");
    int age = 19;
    if (age >= 18) {
        System.out.println("可以投票");
    }
    System.out.println("----结束----");
}

2.1.2 switch 语句

是什么:switch 语句通过匹配某个值,执行对应的代码块。

怎么用

java 复制代码
switch (将要匹配的值) {
    case 值1:
      语句体1;
      break;
    case 值2:
      语句体2;
      break;
    ...
    default:
      语句体n+1;
      break;
}

注意事项

  • 表达式类型只能是 byte、short、int、char(JDK 5 开始支持枚举,JDK 7 开始支持 String)
  • case 给出的值不允许重复,且只能是字面量,不能是变量
  • 正常使用 switch 的时候,不要忘记写 break,否则会出现穿透现象

代码示例

java 复制代码
public static void printWeek(int day) {
    switch (day) {
        case 1:
            System.out.println("星期一");
            break;
        case 2:
            System.out.println("星期二");
            break;
        case 3:
            System.out.println("星期三");
            break;
        case 4:
            System.out.println("星期四");
            break;
        case 5:
            System.out.println("星期五");
            break;
        case 6:
            System.out.println("星期六");
            break;
        case 7:
            System.out.println("星期日");
            break;
        default:
            System.out.println("您的输入有误");
            break;
    }
}

2.2 循环语句

2.2.1 for 循环

是什么:for 循环可以让一段代码重复执行很多次,适合已知循环次数的场景。

怎么用

java 复制代码
for(初始化语句; 条件判断语句; 条件控制语句){
    循环体
}

注意事项

  • 循环中,用于控制循环的变量可以放在循环体中继续使用
  • 条件控制语句,并不一定是++
  • 循环语句()和{}之间不要写分号

代码示例

java 复制代码
public static void demo1() {
    System.out.println("倒计时5秒:");
    for (int i = 1; i <=5; i++) {
        System.out.println(i);
    }
}

2.2.2 while 循环

是什么:while 循环用于重复执行代码块,适合不知道循环次数的场景。

怎么用

java 复制代码
初始化语句;
while(判断语句){
    循环体语句;
    控制语句;
}

注意事项

  • while 循环和 for 循环功能上完全一样,for 能解决的 while 也能解决
  • 使用规范:知道循环次数,使用 for;不知道循环次数建议使用 while

代码示例

java 复制代码
public static void whileDemo() {
    int a=1;
    while(a<=5){
        System.out.println("Hello World");
        a++;
    }
}

2.2.3 do...while 循环

是什么:do...while 循环先执行后判断,至少执行一次循环体。

怎么用

java 复制代码
初始化语句;
do{
    循环体语句;
    条件控制语句;
}(循环条件);

代码示例

java 复制代码
public static void doWhileDemo() {
    int a = 1;
    do {
        System.out.println("Hello World");
        a++;
    } while (a <= 5);
}

2.2.4 continue 与 break

是什么

  • continue:跳过某次循环体内容的执行,继续下一次的执行
  • break:终止循环体内容的执行,结束当前的整个循环

注意事项

  • break 只能在循环和 switch 当中进行使用
  • continue 只能在循环中进行使用
  • 在循环嵌套中,可以使用标号技术操作指定的循环

代码示例

java 复制代码
public static void continueDemo() {
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            continue;
        }
        System.out.println("老师正在给第" + i + "位同学发作业!");
    }
}

public static void breakDemo(){
    for (int i = 9; i <= 12; i++) {
        if(i == 11){
            System.out.println("今天到" + i + "点下班");
            break;
        }
        System.out.println("现在是" + i + "点,工作进行中...");
    }
}

2.3 Random 用法

是什么:Random 类用于生成随机数。

怎么用

  • nextInt() - 生成一个 int 范围内的随机整数
  • nextInt(int bound) - 生成[0, bound) 范围内的随机整数
  • nextDouble() - 生成[0.0, 1.0) 范围内的随机小数
  • nextBoolean() - 生成随机布尔值

注意事项

  • nextInt(100) + 1 才能生成 1-100 的随机数,因为范围是左闭右开 [0, 100)。

代码示例

java 复制代码
import java.util.Random;

public static void randomDemo() {
    Random r = new Random();
    int num = r.nextInt(100) + 1;
    System.out.println("随机整数: " + num);
}

2.4 三种循环的区别

对比维度 for 循环 while 循环 do...while 循环
执行顺序 先判断后执行 先判断后执行 先执行后判断
适用场景 已知循环次数 未知循环次数 至少执行一次
变量作用域 循环内 循环外可访问 循环外可访问

2.5 灵魂拷问:为什么需要循环嵌套?

"学到这你可能有疑问:循环嵌套看起来很复杂,为什么需要它?"

原因是:

  1. 循环嵌套可以处理多维数据,比如二维数组的遍历
  2. 可以实现更复杂的图案打印,比如三角形、矩形等
  3. 可以模拟更真实的业务场景,比如多层级的菜单选择

三、【实战案例】

3.1 案例 1:考试奖励(基础版)

需求描述:根据考试成绩发放不同奖励

  • 考试成绩 >= 90,奖励5000
  • 考试成绩 >= 80,奖励3000
  • 考试成绩 >= 70,奖励1000
  • 考试成绩 >= 60,奖励500
  • 考试成绩 < 60,奖励大嘴巴子

代码实现

java 复制代码
public class IFDemo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入考试成绩:");
        int score = sc.nextInt();
        getReward(score);
    }
    public static void getReward(int score) {
        if (score >= 90) {
            System.out.println("奖励5000");
        } else if (score >= 80) {
            System.out.println("奖励3000");
        } else if (score >= 70) {
            System.out.println("奖励1000");
        } else if (score >= 60) {
            System.out.println("奖励500");
        } else {
            System.out.println("奖励大嘴巴子");
        }
    }
}

运行结果

复制代码
请输入考试成绩:95
奖励5000

3.2 案例 2:猜数字游戏(进阶版)

需求描述:电脑生成1-100的随机数,玩家有三次机会猜测,程序提示猜大了还是猜小了,猜对或用完次数后游戏结束。

代码实现

java 复制代码
import java.util.Random;
import java.util.Scanner;

public class RandomDemo2 {
    public static void main(String[] args) {
        System.out.print("开始游戏!请输入一个100以内的数字,你有三次机会:");
        guessNum();
    }

    public static void guessNum() {
        Random r = new Random();
        Scanner sc = new Scanner(System.in);
        int random = r.nextInt(100) + 1;
        int count = 3;

        while (count > 0) {
            System.out.print("请输入数字(剩余" + count + "次):");
            if (!sc.hasNextInt()) {
                System.out.println("输入无效,请输入整数!");
                sc.next();
                continue;
            }
            int num = sc.nextInt();

            if (random == num) {
                System.out.println("恭喜你,猜对了!!!");
                System.out.println("你猜了 " + (4 - count) + " 次");
                return;
            } else if (random < num) {
                System.out.println("猜大了");
            } else {
                System.out.println("猜小了");
            }
            count--;
        }
        System.out.println("游戏结束!正确答案是 " + random);
    }
}

运行结果

复制代码
开始游戏!请输入一个100以内的数字,你有三次机会:请输入数字(剩余3次):50
猜大了
请输入数字(剩余2次):25
猜小了
请输入数字(剩余1次):37
恭喜你,猜对了!!!
你猜了 3 次

3.3 案例 3:打印三角形(循环嵌套)

需求描述:使用循环嵌套打印直角三角形。

代码实现

java 复制代码
// 样式1:倒直角三角形
for (int i = 0; i < 8; i++) {
    for (int j = i; j < 8; j++) {
        System.out.print('*');
    }
    System.out.println();
}

// 样式2:正直角三角形
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println();
}

运行结果

markdown 复制代码
********
*******
******
*****
****
***
**
*

*
**
***
****
*****

四、【避坑指南/常见问题】

⚠️ 坑点 1:if 语句后加了分号

错误写法

java 复制代码
int age = 17;

if(age >= 18);{
    System.out.println("可以上网吧");
}

正确写法

java 复制代码
int age = 17;

if(age >= 18){
    System.out.println("可以上网吧");
}

原因分析 :分号意味着一条语句结束,if(age >= 18); 这里已经将 if 执行完毕了,{} 里面的代码不被条件所控制了,即:if 判断失效了。

⚠️ 坑点 2:switch 语句忘记写 break

错误写法

java 复制代码
switch (month) {
    case 7:
    case 8:
    case 9:
        System.out.println("秋天");
    case 10:
    case 11:
    case 12:
        System.out.println("冬天");
        break;
    default:
        System.out.println("输入的月份有误");
        break;
}

正确写法

java 复制代码
switch (month) {
    case 1:
    case 2:
    case 3:
        System.out.println("春天");
        break;
    case 4:
    case 5:
    case 6:
        System.out.println("夏天");
        break;
    case 7:
    case 8:
    case 9:
        System.out.println("秋天");
        break;
    case 10:
    case 11:
    case 12:
        System.out.println("冬天");
        break;
    default:
        System.out.println("输入的月份有误");
        break;
}

原因分析:如果忘记写 break,程序会发生穿透现象,会自动向下执行,直到遇到 break 语句或者 switch 语句结束为止。

⚠️ 坑点 3:for 循环后加了分号

错误写法

java 复制代码
int x = 0;
for (x = 1; x <= 3; x++); { // 这里多了个分号,大坑!
    System.out.println("我只会执行一次!x = " + x);
}

正确写法

java 复制代码
int x = 0;
for (x = 1; x <= 3; x++) { // 没有分号!
    System.out.println("循环正常执行!x = " + x);
}

原因分析:for() 后面直接写 ; 循环体是空的,所以大括号里的代码只会执行一次。


五、【总结回顾】

📝 核心要点速记

  1. 流程控制分为三大结构:顺序结构、分支结构、循环结构
  2. 分支结构包括 if 语句和 switch 语句,用于根据条件执行不同代码
  3. 循环结构包括 for、while、do-while,用于重复执行代码
  4. continue 用于跳过某次循环,break 用于终止整个循环
  5. 循环嵌套可以实现更复杂的功能,如图案打印和多维数据处理

🔥 面试高频题

  1. Q: for 循环和 while 循环的区别是什么? A: 功能上完全一样,for 适合已知循环次数的场景,while 适合未知循环次数的场景。

  2. Q: switch 语句可以使用哪些数据类型? A: byte、short、int、char(JDK 5 开始支持枚举,JDK 7 开始支持 String)。

  3. Q: do-while 循环的特点是什么? A: 先执行后判断,至少执行一次循环体。

  4. Q: break 和 continue 的区别是什么? A: break 终止整个循环,continue 跳过本次循环继续下一次。


📚 系列文章导航

【JavaSE 从 0 到 1】系列(已完结 5/17 篇)

🔹环境搭建篇

  • ✅ [第 1 篇] 还在卡 Java 环境?10 分钟搞定 JDK 配置的保姆级教程
  • ✅ [第 2 篇] Java 开发必备:JDK 多版本共存与切换,一篇就够

🔹 语法基础篇

  • ✅ [第 3 篇] 告别语法混乱!Java 基础语法:理清变量、数据类型与运算符
  • ✅ [第 4 篇] 你的 main 方法是不是写了 200 行?方法拆分技巧让代码清爽 10 倍

🔹 流程控制篇

  • ✅[第 5 篇] 告别逻辑混乱!Java 流程控制让代码学会"判断和循环"← 当前这篇

💬 互动区

  • "你在学习流程控制的过程中遇到过什么问题?评论区聊聊~"
  • "你觉得哪种循环最常用?为什么?"
  • "还想看哪些 Java 基础知识点的详解?留言告诉我!"

如果这篇文章对你有帮助,欢迎点赞 + 收藏,也欢迎转发给一起学习的小伙伴!

关注我,不错过后续的每一篇实战笔记!我们一起完成 AI 开发学习之旅~


📄 版权说明

  • 作者:木圭
  • 首发平台:掘金 / 微信公众号(搜索:木圭学编程)
  • 转载请联系作者,注明出处
  • 学习笔记仅供参考,欢迎指正错误
相关推荐
ltl2 小时前
SM3 vs SHA-256:两个哈希函数的设计哲学与性能实测
后端·算法
MmeD UCIZ2 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
ward RINL2 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
yaaakaaang2 小时前
三、抽象工厂模式
java·抽象工厂模式
kongba0072 小时前
复刻 Claude Code 项目御马术缰绳系统 harness engineering 落地蓝图
java·linux·服务器
云天0012 小时前
前端私活神器,nodejs+vue3+typescript全栈框架,
前端·后端·node.js
tERS ERTS2 小时前
Spring Cloud gateway 路由规则
java
ZUNr12 小时前
手写一个迷你版 @Column:注解到底是怎么工作的?
java
Treh UNFO2 小时前
MySQL中的通配符
java