☰
大二java第四课
2026/10/24 6:36:59 网站建设 项目流程

大二上学期 Java 第四课:流程控制——分支与循环

第三课解决了"算得对"和"读得进",第四课解决"按什么顺序走"。分支决定程序走哪条路,循环决定一段路走几遍。这一课语法不难,但坑全在边界和细节上:if-else 的悬挂、switch 的穿透、循环的边界条件,每一个都是实验课调试的高频事故点。

一、流程控制的地图:三种结构

任何程序的控制流只有三种基本结构:顺序、分支、循环。顺序结构就是代码从上往下依次执行,不需要专门语法。这一课重点讲分支和循环,它们是后面所有算法题的骨架。

二、if 分支:三种形态

2.1 单分支与双分支

单分支是"条件成立就做,不成立就跳过";双分支是"成立做 A,不成立做 B"。条件表达式的结果必须是布尔值,这是第二课强调过的:Java 里不能拿数字当条件,和 C 语言不同。

2.2 多分支与 else if 链

多个条件互斥时用 else if 串起来。关键理解:else if 链是"从上往下依次判断,一旦某个条件成立,执行完就跳出整条链",后面的条件不再判断。所以条件的书写顺序很重要:范围判断要从大到小或从小到大排好,顺序乱了逻辑就错。

常见错误:把本应互斥的多个 if 写成并列的独立 if,结果多个分支都执行了。并列 if 和 else if 链的区别,是第四课第一个必须搞清楚的点。

2.3 悬挂 else 问题

当 if 后面只有一条语句时,大括号可以省略。但嵌套 if 时省略大括号,else 会和最近的、还没配对的 if 结合,而不是和你想的那个 if 配对。这就是"悬挂 else"问题。

解决方式很简单:永远写大括号。哪怕只有一行,也加上。这个问题在 C 语言里就存在,Java 一样,大二阶段直接养成"if 必带大括号"的习惯,一劳永逸。

三、switch 分支:等值判断的专用工具

3.1 适用场景与基本结构

switch 适合对一个变量做多个等值判断的场景,比如根据菜单编号跳转到不同功能。它的结构是:一个待判断的表达式,加若干个 case 分支,最后可以有一个 default 兜底。

能用于 switch 判断的类型有限制:整数类型、字符型、字符串(较新版本支持)、枚举。浮点数和布尔值不能用于 switch,这是常考点。

3.2 穿透现象:switch 最大的坑

现象:某个 case 匹配上之后,执行完它下面的语句,如果没有遇到跳出语句,会继续往下执行后面所有 case 的语句,直到遇到跳出语句或 switch 结束。这叫"穿透"。

原因:switch 的本质是"跳转到匹配的 case 标签,然后一路往下执行",它不会自动在每个 case 末尾停下。

两种用法:

· 绝大多数情况要避免穿透:每个 case 末尾加跳出语句;
· 少数情况可以利用穿透:多个 case 共享同一段处理逻辑时,把它们的标签叠在一起,最后只写一次处理代码和跳出语句。这是合法的技巧,但要写注释说明意图,否则别人读代码会以为是漏写了跳出。

default 的位置:default 可以放在任意位置,不一定在最后。但不管放哪,它的执行时机都是"所有 case 都不匹配时",和书写位置无关。放在最后是惯例,可读性最好。

3.3 switch 和 if 怎么选

判断条件是"等于某几个固定值"用 switch,可读性好;判断条件是"范围、区间、复杂逻辑组合"用 if。两者可以互相改写,但各有适用场景,实验课写菜单程序基本都用 switch。

四、循环:三种写法,一个核心

4.1 三种循环的分工

· for 循环:循环次数已知时首选,初始化、条件、更新三部分写在一行,结构最紧凑;
· while 循环:循环次数未知、靠条件决定是否继续时用,先判断后执行;
· do-while 循环:先执行后判断,循环体至少执行一次。这是它和 while 唯一的本质区别,也是考点。

选择建议:次数明确用 for,次数不明确用 while,必须至少执行一次用 do-while。实验课的菜单程序通常用 do-while,因为菜单至少要显示一次。

4.2 循环的四个要素

写任何循环前,先想清楚四件事:

1. 初始化:循环变量从哪开始;
2. 条件:什么时候继续循环;
3. 循环体:每轮做什么;
4. 更新:每轮结束后循环变量怎么变。

漏掉更新就是死循环,这是实验课最常见的事故。程序卡住不动、风扇狂转,先检查循环变量有没有更新。

4.3 边界条件:小于还是小于等于

循环条件写"小于"还是"小于等于",决定了循环执行几次,这是循环题最大的失分点。

判断方法:代入边界值手动模拟一遍。比如从 1 循环到 10,如果条件是"小于等于 10",最后一轮是 10,共 10 次;如果写成"小于 10",最后一轮是 9,只有 9 次。差一次,结果全错。

数组相关的循环尤其要注意:数组下标从 0 开始,长度一层是 n 的数组,合法下标是 0 到 n-1,所以循环条件通常是"小于长度",写成"小于等于长度"就会越界。这个坑到后面学数组时会集中爆发,第四课先把"边界要手动模拟"的习惯建立起来。

4.4 嵌套循环

循环里套循环,外层控制行、内层控制列,是打印图形题的标准套路。关键理解:外层每走一轮,内层完整走一遍。所以总执行次数是两层次数的乘积。

嵌套循环的性能问题大二阶段不用深究,但要有一个直觉:嵌套层数越多,执行次数增长越快,能解决就别套两层。

五、两个跳转语句:break 和 continue

5.1 break:跳出当前层

break 用在循环里,作用是立即结束当前这一层循环,跳到循环后面的语句。用在 switch 里,作用是结束 switch 的穿透。

注意:break 只跳出它所在的那一层循环。嵌套循环里,内层的 break 只结束内层,外层继续。想跳出外层需要加标签,大二上学期一般不要求,知道有这个限制即可。

5.2 continue:跳过本轮

continue 的作用是结束当前这一轮,直接进入下一轮的条件判断,循环本身不结束。

break 和 continue 的区别是必考点:break 是"整个循环不干了",continue 是"这一轮不干了,下一轮继续"。

5.3 使用建议

break 和 continue 用多了会让循环逻辑变得难以阅读。能用循环条件表达清楚的,就不要用跳转语句。比如"找到就停"可以用 break,但"跳过偶数"完全可以把条件写进循环里,不一定要 continue。

六、第四课就该养成的习惯

习惯一:if 和循环一律带大括号。 省大括号带来的悬挂 else 和后续加代码时的逻辑错,代价远大于那两行括号。

习惯二:写循环先写四要素,再写循环体。 初始化、条件、更新先想清楚,循环体最后填,能避免大部分死循环和差一次的问题。

习惯三:边界值手动模拟一遍。 写完循环,拿最小值和最大值各代进去走一遍,确认次数对。这个动作花不了一分钟,能省下半小时调试。

习惯四:复杂条件抽成布尔变量。 条件表达式太长时,拆成几个有名字的布尔变量,代码可读性立刻上一个台阶,也方便调试时逐个检查。

七、课后自测(答案在下一课笔记里)

1. 并列的多个 if 和 else if 链,在什么情况下结果不同?举一个具体场景。
2. switch 的穿透现象是什么原因造成的?什么情况下可以故意利用它?
3. while 和 do-while 的本质区别是什么?各举一个适合用的场景。
4. 循环条件写"小于"和"小于等于",怎么快速判断哪个对?

---

下一篇预告:数组——一维数组的声明、初始化、遍历,以及那个让无数人栽跟头的"下标越界"。第四课建立的边界意识,到第五课会直接派上用场。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询