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

0 阅读11分钟

🔥 前言

"学 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 类型的结果

代码示例

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 语句通过匹配某个值,执行对应的代码块。

怎么用

switch (将要匹配的值) {
    case1:
      语句体1;
      break;
    case2:
      语句体2;
      break;
    ...
    default:
      语句体n+1;
      break;
}

注意事项

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

代码示例

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 循环可以让一段代码重复执行很多次,适合已知循环次数的场景。

怎么用

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

注意事项

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

代码示例

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

2.2.2 while 循环

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

怎么用

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

注意事项

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

代码示例

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

2.2.3 do...while 循环

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

怎么用

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

代码示例

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 只能在循环中进行使用
  • 在循环嵌套中,可以使用标号技术操作指定的循环

代码示例

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

代码示例

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,奖励大嘴巴子

代码实现

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的随机数,玩家有三次机会猜测,程序提示猜大了还是猜小了,猜对或用完次数后游戏结束。

代码实现

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:打印三角形(循环嵌套)

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

代码实现

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

运行结果

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

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

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

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

错误写法

int age = 17;

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

正确写法

int age = 17;

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

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

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

错误写法

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

正确写法

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 循环后加了分号

错误写法

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

正确写法

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 开发学习之旅~


📄 版权说明

  • 作者:木圭
  • 首发平台:掘金 / 微信公众号(搜索:木圭学编程)
  • 转载请联系作者,注明出处
  • 学习笔记仅供参考,欢迎指正错误