🔥 前言
"学 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 (将要匹配的值) {
case 值1:
语句体1;
break;
case 值2:
语句体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 灵魂拷问:为什么需要循环嵌套?
"学到这你可能有疑问:循环嵌套看起来很复杂,为什么需要它?"
原因是:
- 循环嵌套可以处理多维数据,比如二维数组的遍历
- 可以实现更复杂的图案打印,比如三角形、矩形等
- 可以模拟更真实的业务场景,比如多层级的菜单选择
三、【实战案例】
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() 后面直接写 ; 循环体是空的,所以大括号里的代码只会执行一次。
五、【总结回顾】
📝 核心要点速记
- 流程控制分为三大结构:顺序结构、分支结构、循环结构
- 分支结构包括 if 语句和 switch 语句,用于根据条件执行不同代码
- 循环结构包括 for、while、do-while,用于重复执行代码
- continue 用于跳过某次循环,break 用于终止整个循环
- 循环嵌套可以实现更复杂的功能,如图案打印和多维数据处理
🔥 面试高频题
-
Q: for 循环和 while 循环的区别是什么? A: 功能上完全一样,for 适合已知循环次数的场景,while 适合未知循环次数的场景。
-
Q: switch 语句可以使用哪些数据类型? A: byte、short、int、char(JDK 5 开始支持枚举,JDK 7 开始支持 String)。
-
Q: do-while 循环的特点是什么? A: 先执行后判断,至少执行一次循环体。
-
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 开发学习之旅~
📄 版权说明
- 作者:木圭
- 首发平台:掘金 / 微信公众号(搜索:木圭学编程)
- 转载请联系作者,注明出处
- 学习笔记仅供参考,欢迎指正错误