continue 是 Java 中的一个关键字,它属于流程控制语句,它的核心作用是:立即终止当前正在执行的循环迭代,并跳转到循环的条件判断部分,准备开始下一次迭代。

可以把它想象成:老师正在检查一个小组的作业,当你(continue)发现某个同学的作业有严重错误时,你立刻跳过对他的所有检查(break 会直接让你离开整个小组),并直接开始检查下一位同学。
continue 的基本工作原理
continue 只能用在循环语句中,包括 for 循环、while 循环和 do-while 循环。
当 continue 语句被执行时:
- 程序会立即跳过当前循环体中
continue语句之后的所有代码。 - 直接进入循环的“更新”或“条件判断”阶段。
- 在
for循环中,会执行for语句的第三部分(i++等)。 - 在
while和do-while循环中,会直接跳转到条件判断表达式。
- 在
continue 在不同循环中的具体用法
在 for 循环中
这是最常见的使用场景。continue 会跳过当前迭代中剩余的代码,然后执行 i++,再进行条件判断。

示例:打印 1 到 10 之间除了 5 以外的所有数字
public class ContinueExample {
public static void main(String[] args) {
System.out.println("--- 在 for 循环中使用 continue ---");
for (int i = 1; i <= 10; i++) {
// i 等于 5,就跳过本次循环的剩余部分
if (i == 5) {
continue; // 跳转到 i++,然后判断 i <= 10
}
// 这行代码在 i == 5 时不会被执行
System.out.println("当前数字是: " + i);
}
}
}
执行流程分析:
- 当
i为 1, 2, 3, 4, 6, 7, 8, 9, 10 时,if条件不成立,System.out.println正常执行。 - 当
i为 5 时,if (i == 5)条件成立,continue语句被执行。 - 程序立即跳过
System.out.println("当前数字是: " + i);这一行。 - 直接执行
for循环的i++,i变为 6。 - 然后判断
i <= 10,成立,继续下一次循环。
输出结果:
--- 在 for 循环中使用 continue ---
当前数字是: 1
当前数字是: 2
当前数字是: 3
当前数字是: 4
当前数字是: 6
当前数字是: 7
当前数字是: 8
当前数字是: 9
当前数字是: 10
在 while 循环中
在 while 循环中,continue 会跳过剩余代码,然后直接跳转到 while 的条件判断部分。

示例:跳过负数,只打印正数
public class ContinueWhileExample {
public static void main(String[] args) {
System.out.println("--- 在 while 循环中使用 continue ---");
int i = -2;
while (i < 5) {
if (i < 0) {
i++; // 必须在这里递增,否则会进入死循环!
continue; // 跳过打印,直接跳转到 while (i < 5) 判断
}
System.out.println("当前数字是: " + i);
i++;
}
}
}
执行流程分析:
i初始为 -2。while (i < 5)成立。if (i < 0)成立,执行i++(i变为 -1),然后执行continue。- 跳过
System.out.println,直接跳转到while (i < 5)判断。 i仍为 -1,循环继续。- 再次进入
if,i++(i变为 0),continue。 - 跳过打印,再次判断
while (i < 5)。 i为 0,if条件不成立,打印 "当前数字是: 0",i++。- ...以此类推,直到
i为 5 时,循环结束。
输出结果:
--- 在 while 循环中使用 continue ---
当前数字是: 0
当前数字是: 1
当前数字是: 2
当前数字是: 3
当前数字是: 4
⚠️ 重要提示: 在
while或do-while循环中使用continue时,要确保循环变量的值在continue执行前得到改变,否则可能会导致死循环,上面的例子中,我们在continue之前加了i++,就是为了避免这个问题。
在 do-while 循环中
do-while 的工作原理与 while 类似,continue 也会跳到条件判断部分,唯一的区别是 do-while 至少会执行一次。
带标签的 continue (Labeled `continue)
这是 continue 一个更强大但相对少见的用法,它允许你从一个嵌套循环中直接跳转到外层循环的指定位置。
语法:
continue 外层循环的标签名;
为什么需要它?
考虑一个场景:我们有两个循环,内层和外层,在内层循环中,如果我们使用普通的 continue,它只会影响内层循环,如果我们想在内层循环的某个条件下,直接跳出整个内层循环,并让外层循环开始下一次迭代,就需要带标签的 continue。
示例:在一个 5x5 的矩阵中,当行号和列号相等时(即对角线),跳过当前行的剩余列,直接开始下一行的迭代。
public class LabeledContinueExample {
public static void main(String[] args) {
System.out.println("--- 使用带标签的 continue ---");
// 为外层循环定义一个标签 "outerRow"
outerRow:
for (int row = 0; row < 5; row++) {
System.out.println("\n--- 开始处理第 " + (row + 1) + " 行 ---");
for (int col = 0; col < 5; col++) {
// 如果列号等于行号,就跳转到 outerRow 标记的位置
if (col == row) {
System.out.println(" 在 (" + row + ", " + col + ") 处遇到对角线,跳过此行剩余列。");
continue outerRow; // 跳转到外层循环的下一轮
}
System.out.println(" 处理元素 (" + row + ", " + col + ")");
}
// 这里的代码永远不会被执行,因为 continue outerRow 已经跳出了整个内层循环
System.out.println(" 这行代码不会被打印。");
}
}
}
执行流程分析:
- 外层循环
row从 0 到 4。 - 当
row = 0:- 内层循环
col从 0 开始。 - 当
col = 0,col == row成立,执行continue outerRow。 - 程序立即跳转到外层循环
outerRow:的末尾,row变为 1,开始下一轮外层循环。
- 内层循环
- 当
row = 1:- 内层循环
col从 0 开始。 - 当
col = 1,col == row成立,执行continue outerRow。 - 程序再次跳转到外层循环,
row变为 2,开始下一轮。
- 内层循环
- ...以此类推。
输出结果:
--- 使用带标签的 continue ---
--- 开始处理第 1 行 ---
在 (0, 0) 处遇到对角线,跳过此行剩余列。
--- 开始处理第 2 行 ---
处理元素 (1, 0)
在 (1, 1) 处遇到对角线,跳过此行剩余列。
--- 开始处理第 3 行 ---
处理元素 (2, 0)
处理元素 (2, 1)
在 (2, 2) 处遇到对角线,跳过此行剩余列。
--- 开始处理第 4 行 ---
处理元素 (3, 0)
处理元素 (3, 1)
处理元素 (3, 2)
在 (3, 3) 处遇到对角线,跳过此行剩余列。
--- 开始处理第 5 行 ---
处理元素 (4, 0)
处理元素 (4, 1)
处理元素 (4, 2)
处理元素 (4, 3)
在 (4, 4) 处遇到对角线,跳过此行剩余列。
continue 与 break 的关键区别
| 特性 | continue |
break |
|---|---|---|
| 作用 | 跳过当前迭代的剩余部分,继续下一次迭代。 | 终止整个循环,循环不再继续执行。 |
| 影响范围 | 只影响它所在的一层循环。 | 只影响它所在的一层循环(除非与标签配合)。 |
| 带标签用法 | continue label; 可以跳转到外层循环的下一次迭代。 |
break label; 可以跳出外层循环本身。 |
| 比喻 | “这个同学不对,不检查他了,检查下一个。” | “这个小组全都不用检查了,我们直接解散。” |
示例对比:
// continue 的例子
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
System.out.print(i + " "); // 输出: 1 2 4 5
}
// break 的例子
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
System.out.print(i + " "); // 输出: 1 2
}
最佳实践和注意事项
-
避免过度使用:
continue可以让代码逻辑更清晰(处理一个“特殊情况”后跳过),但如果滥用,尤其是多层嵌套时,会使代码流程变得难以追踪,有时,使用if-else结构会更加直观。- 可读性差:
for (int i = 0; i < items.length; i++) { if (items[i] == null) { continue; } // 处理 items[i] } - 可读性好:
for (int i = 0; i < items.length; i++) { if (items[i] != null) { // 处理 items[i] } }第二种写法通常更符合“正面编程”的思想,即“当满足条件时执行”,而不是“当不满足条件时跳过”。
- 可读性差:
-
小心死循环:如前所述,在
while和do-while循环中,确保在continue之前更新循环变量,否则可能导致无限循环。 -
标签命名要清晰:在使用带标签的
continue时,标签名应该具有描述性(如outerRow,searchLoop),以便于理解其跳转的目标。
| 用法 | 描述 | 示例 |
|---|---|---|
| 基本用法 | 跳过当前循环迭代,进入下一次。 | for (int i=0; i<10; i++) { if (i%2==0) continue; ... } |
在 while 中 |
跳转到条件判断,注意更新循环变量。 | while (i < 10) { if (i < 0) { i++; continue; } ... } |
| 带标签用法 | 从内层循环跳转到外层循环的下一次迭代。 | outer: for (...) { for (...) { if (...) continue outer; } } |
理解 continue 的核心思想是“跳过本次,继续下次”,并与 break 的“彻底终止”明确区分开,就能在 Java 编程中熟练、正确地使用它。
