Java里的continue关键字是循环控制体系里最容易被低估、却又极其实用的一个工具。它的核心职责非常单纯:当程序执行流碰到continue语句时,当前这次循环迭代中位于它之后的所有代码都会被直接丢弃,循环不会终止,而是马上回到迭代更新的位置(或者条件判断的位置),准备进入下一次循环。这种机制特别适合在批量处理数据时,把不符合条件或者无需处理的记录快速略过,从而降低嵌套判断的复杂度。

continue在三种基础循环中的行为差异
在for循环里,continue会跳过循环体剩余部分,然后执行for括号里的第三个表达式(通常是i++这类自增操作),再判断循环条件。这意味着即便你用了continue,计数器依然会正常推进,不容易写出死循环。下面这段代码演示了如何跳过奇数,只打印偶数:
public class ContinueForDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 如果是奇数就跳过本次循环
if (i % 2 != 0) {
continue;
}
System.out.println("偶数: " + i);
}
}
}
在while循环中情况稍有不同,因为while没有专门的迭代语句块,自增或状态推进通常写在循环体内部。如果你在continue之前忘了写推进逻辑,就会卡死在当前状态。例如下面这段有隐患的代码,如果continue被触发且i没有增加,就会变成死循环:
public class ContinueWhileDemo {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
if (i == 2) {
continue; // 危险:i没有自增,会一直卡在2
}
System.out.println("i = " + i);
i++;
}
}
}
正确的while写法应当把自增放在continue可能跳过的范围之外,或者放在continue之前。对于do-while来说,它先执行一次循环体再判断条件,continue的效果和while类似,也是跳回条件判断处,因此同样要注意状态变量的更新位置,否则也会出现无限循环。
带标签的continue与嵌套循环跳过
当遇到多层嵌套循环时,普通的continue只能作用于它所在的那一层循环。如果希望跳过外层循环的当前轮次,就需要使用带标签的continue。标签写法是先定义一个紧跟着冒号的标识符,放在循环之前,然后在continue后面加上该标签名。这种语法在矩阵遍历、棋盘搜索等场景中非常直观。
public class LabeledContinueDemo {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) {
// 跳过外层循环本次迭代,直接进入i的下一轮
continue outer;
}
System.out.println("i=" + i + ", j=" + j);
}
}
}
}
上面的代码当j等于1时,直接跳回outer标签对应的for循环迭代更新处,因此内层循环后续j=2的情况根本不会执行。这种方式比用一堆boolean标志位去控制内层是否继续要清晰得多,但也容易被滥用,导致代码跳转关系难以追踪。
从可读性角度看,带标签的continue应当只用在层级很深、且跳过逻辑确实能简化结构的场合。如果嵌套超过三层,更推荐把内层逻辑抽取成独立方法,用return提前结束方法来达到类似效果,这样调用栈更清楚,也方便单元测试。
continue与业务过滤场景的最佳实践
在实际业务里,continue最常见的用途就是数据清洗和条件过滤。比如从数据库查出一批订单,其中部分订单状态非法或者金额为负数,这时候在循环里用continue直接略过,比写一大串if-else嵌套要优雅。下面的例子展示了过滤空用户名和冻结账户:
import java.util.List;
public class OrderFilterDemo {
static class User {
String name;
boolean frozen;
User(String n, boolean f) { name = n; frozen = f; }
}
public static void main(String[] args) {
List<User> users = List.of(
new User(null, false),
new User("Alice", false),
new User("Bob", true)
);
for (User u : users) {
if (u.name == null || u.name.isEmpty()) {
continue; // 跳过没有用户名的记录
}
if (u.frozen) {
continue; // 跳过被冻结的账户
}
System.out.println("处理正常用户: " + u.name);
}
}
}
这种写法把每种“不处理”的原因都变成独立的早跳过分支,主流程只剩下真正需要执行业务的部分。相比把全部逻辑包在一个巨大if里,它减少了缩进层级,也更符合“失败快速返回”的编码习惯。不过要注意,如果跳过条件越来越多,循环体里会散落多个continue,此时可以考虑用Stream.filter来声明式地表达过滤规则,让意图更明显。
还有一个容易忽略的点:在增强型for循环(for-each)中使用continue是安全的,因为它底层依赖迭代器,不会因跳过而影响遍历进度。但如果遍历的是普通数组且你在循环里做了下标操作,就要确保continue不会破坏你自定义的下标推进逻辑。总之,把continue当作“本轮不值得做,直接看下一个”的语义来表达,往往能让循环代码既短小又容易推理。
Javacontinueloop_control修改时间:2026-08-17 04:28:14