|
|
@@ -274,6 +274,107 @@ do {
|
|
|
|
|
|
---
|
|
|
|
|
|
+### 5. 循环控制语句(结束循环的三种方式)
|
|
|
+
|
|
|
+Java 提供了三种方式控制循环的执行流程:
|
|
|
+
|
|
|
+| 控制语句 | 作用 | 说明 |
|
|
|
+|---------|------|------|
|
|
|
+| **`break`** | 结束整个循环 | 跳出循环体,继续执行循环后面的代码 |
|
|
|
+| **`continue`** | 结束本轮循环 | 跳过本次循环剩余代码,继续执行下一轮循环 |
|
|
|
+| **`return`** | 结束整个方法 | 直接结束当前方法,方法中循环后面的代码也不再执行 |
|
|
|
+
|
|
|
+#### ① break — 结束整个循环
|
|
|
+
|
|
|
+```java
|
|
|
+for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ break; // i == 3 时结束整个循环
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+}
|
|
|
+// 输出:0 1 2
|
|
|
+// 循环到此结束,继续执行循环外的代码
|
|
|
+System.out.println(".....循环后的代码....");
|
|
|
+```
|
|
|
+
|
|
|
+> `break` 执行后,循环立即终止,程序继续执行循环后面的代码。
|
|
|
+
|
|
|
+#### ② continue — 结束本轮循环
|
|
|
+
|
|
|
+```java
|
|
|
+for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ continue; // i == 3 时跳过本轮,不执行输出
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+}
|
|
|
+// 输出:0 1 2 4 5 6 7 8 9
|
|
|
+// 注意:没有 3,因为 i==3 时跳过了本次循环
|
|
|
+```
|
|
|
+
|
|
|
+> `continue` 执行后,本轮循环中剩余的代码不再执行,直接进入下一轮迭代(i++ → 判断条件)。
|
|
|
+
|
|
|
+#### ③ return — 结束整个方法
|
|
|
+
|
|
|
+```java
|
|
|
+for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ return; // i == 3 时结束方法,循环后面的代码也不执行了
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+}
|
|
|
+// 输出:0 1 2
|
|
|
+// 注意:循环后面的所有代码都不会执行
|
|
|
+System.out.println(".....循环后的代码...."); // ❌ 不会执行
|
|
|
+```
|
|
|
+
|
|
|
+> `return` 比 `break` 更"狠"——它不仅结束循环,还会直接结束整个 `main` 方法,方法内循环后面的所有代码都不再执行。
|
|
|
+
|
|
|
+#### 三种控制语句对比
|
|
|
+
|
|
|
+| 控制语句 | 影响范围 | 循环剩余代码 | 循环外代码 | 适用场景 |
|
|
|
+|---------|---------|------------|-----------|---------|
|
|
|
+| **`break`** | 仅当前循环 | 不执行 | 继续执行 | 找到目标后提前退出循环 |
|
|
|
+| **`continue`** | 仅本轮循环 | 不执行(跳到下一轮) | 继续执行 | 跳过某些不符合条件的值 |
|
|
|
+| **`return`** | 整个方法 | 不执行 | 不执行 | 方法执行完毕或异常提前返回 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 6. 流程控制中的常见陷阱
|
|
|
+
|
|
|
+#### ① 浮点类型精度问题
|
|
|
+
|
|
|
+```java
|
|
|
+double a = 0.1 + 0.2;
|
|
|
+System.out.println(a); // 0.30000000000000004
|
|
|
+if (a == 0.3) {
|
|
|
+ System.out.println("相等");
|
|
|
+} else {
|
|
|
+ System.out.println("不想等");
|
|
|
+}
|
|
|
+// 输出:不想等
|
|
|
+```
|
|
|
+
|
|
|
+> **原因**:浮点数采用 IEEE 754 标准存储,`0.1 + 0.2` 在计算机中无法精确表示为 `0.3`,而是近似值 `0.30000000000000004`。
|
|
|
+
|
|
|
+#### ② switch 的穿透问题
|
|
|
+
|
|
|
+```java
|
|
|
+int x = 2;
|
|
|
+switch (x) {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ case 3:
|
|
|
+ System.out.println("1~3");
|
|
|
+ break;
|
|
|
+}
|
|
|
+// 输出:1~3
|
|
|
+// 如果 case 1、case 2 不加 break,会一直穿透到 case 3
|
|
|
+```
|
|
|
+
|
|
|
+> **穿透技巧**:当多个 case 需要执行相同的代码时,可以利用穿透特性,只在最后一个 case 写 `break`,减少重复代码。
|
|
|
+
|
|
|
## 三、课后作业讲解(7月14日作业)
|
|
|
|
|
|
### 题目 1:判断闰年
|
|
|
@@ -647,7 +748,7 @@ public class Demo01 {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### Demo02.java — 循环结构
|
|
|
+### Demo02.java — 循环结构 + 流程控制陷阱
|
|
|
|
|
|
```java
|
|
|
/**
|
|
|
@@ -688,7 +789,83 @@ public class Demo02 {
|
|
|
do...while 至少执行一次循环体
|
|
|
*/
|
|
|
|
|
|
- // 练习:分别使用 for、while 和 do...while 循环 1~100 之间的整数
|
|
|
+ // ========== 流程控制中的陷阱 ==========
|
|
|
+
|
|
|
+ // 陷阱 1:浮点类型精度问题
|
|
|
+ double a = 0.1 + 0.2;
|
|
|
+ System.out.println(a); // 0.30000000000000004
|
|
|
+ if (a == 0.3) {
|
|
|
+ System.out.println("相等");
|
|
|
+ } else {
|
|
|
+ System.out.println("不想等");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 陷阱 2:switch 的穿透问题
|
|
|
+ // 如果不加 break,case 会一直穿透
|
|
|
+ int x = 2;
|
|
|
+ switch (x) {
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ case 3:
|
|
|
+ System.out.println("1~3");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo03.java — 循环控制语句(break / continue / return)
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo03
|
|
|
+ * @description 结束循环的语句
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo03 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ /*
|
|
|
+ 有 3 种方式可以结束循环
|
|
|
+ break; 结束循环,继续执行循环后面的代码
|
|
|
+ continue; 结束本轮循环,继续执行下一轮循环
|
|
|
+ return; 结束方法,顺便结束循环
|
|
|
+ */
|
|
|
+
|
|
|
+ // ===== continue:结束本轮循环 =====
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ continue; // i==3 时跳过本轮,不输出 3
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+ }
|
|
|
+ // 输出:0 1 2 4 5 6 7 8 9
|
|
|
+
|
|
|
+ System.out.println("---------------------------------------");
|
|
|
+
|
|
|
+ // ===== break:结束整个循环 =====
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ break; // i==3 时结束整个循环
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+ }
|
|
|
+ // 输出:0 1 2
|
|
|
+ System.out.println(".....循环后的代码....");
|
|
|
+
|
|
|
+ System.out.println("---------------------------------------");
|
|
|
+
|
|
|
+ // ===== return:结束整个方法 =====
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ if (i == 3) {
|
|
|
+ return; // i==3 时结束方法,循环后的代码也不执行
|
|
|
+ }
|
|
|
+ System.out.println(i);
|
|
|
+ }
|
|
|
+ // 输出:0 1 2
|
|
|
+ // 以下代码不会执行!
|
|
|
+ System.out.println(".....循环后的代码....");
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
@@ -719,6 +896,12 @@ public class Demo02 {
|
|
|
20. **作业-数字加密**:取每位 → 加5 → 取余10 → 位置互换
|
|
|
21. **变量交换**:可使用加减法实现不借助第三变量的交换
|
|
|
22. **进制表示**:`0b` 二进制、`0` 八进制、`0x` 十六进制
|
|
|
+23. **循环控制语句**:`break` 结束整个循环,`continue` 结束本轮循环,`return` 结束整个方法
|
|
|
+24. **`break`**:跳出当前循环体,继续执行循环后面的代码
|
|
|
+25. **`continue`**:跳过本轮循环中剩余代码,直接进入下一轮迭代
|
|
|
+26. **`return`**:直接结束整个方法,方法内循环后的所有代码都不再执行
|
|
|
+27. **浮点精度陷阱**:`0.1 + 0.2` 不等于 `0.3`,浮点数不能直接用 `==` 比较
|
|
|
+28. **switch 穿透利用**:多个 case 执行相同代码时,可以利用穿透特性只在最后一个 case 写 `break`
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -738,3 +921,8 @@ public class Demo02 {
|
|
|
| **整除 `/` 与取余 `%`** | 常用于数字分解,如获取一个整数的各个位上的数字 |
|
|
|
| **变量交换算法** | 不借助第三个变量,通过加减法或异或运算交换两个变量的值 |
|
|
|
| **进制前缀** | `0b`(二进制)、`0`(八进制)、`0x`(十六进制) |
|
|
|
+| **`break`** | 结束整个循环,继续执行循环后的代码 |
|
|
|
+| **`continue`** | 结束本轮循环,跳过本轮剩余代码,直接进入下一轮 |
|
|
|
+| **`return`** | 结束当前方法,方法内所有剩余代码都不执行 |
|
|
|
+| **浮点精度** | IEEE 754 标准导致 `0.1 + 0.2 ≠ 0.3`,避免用 `==` 直接比较浮点数 |
|
|
|
+| **switch 穿透** | 不写 `break` 时 case 会穿透到下个 case,可利用此特性合并相同逻辑 |
|