
continue 在 for 循环里怎么跳过当前迭代
它不终止整个循环,只让控制权立刻回到循环条件判断处,开始下一轮。常见错误是把它和 break 混用,结果该跳过的没跳过,该退出的又没退出。
使用场景比如遍历列表时过滤掉空值或非法数据:
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (s == null || s.trim().isEmpty()) {
continue; // 跳过空字符串,不执行后续处理
}
process(s); // 只对有效字符串调用
}
-
continue后面不能跟标签以外的语句(比如不能写continue; System.out.println("x");) - 在增强 for 循环(
for (String s : list))中也能用,效果一样——跳过本次元素处理 - 注意别放在 try-catch 的 catch 块末尾还想着“继续循环”,除非你明确知道异常发生后循环变量状态是安全的
带标签的 continue 怎么跳出多层嵌套循环
Java 支持给循环加标签,然后用 continue + 标签名直接跳到指定外层循环的下一次迭代。这是唯一能从内层循环干净跳回外层的方法,比靠布尔标志位更直观。
典型场景是二维数组查找匹配项后跳过剩余列、进入下一行:
立即学习“Java免费学习笔记(深入)”;
outer: for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == target) {
System.out.println("found at " + i + "," + j);
continue outer; // 立刻结束内层循环,并开始 outer 的下一轮 i++
}
}
}
- 标签名后必须跟冒号,且只能放在循环语句正前方(不能缩进、不能隔行)
- 标签作用域仅限于紧随其后的那个循环,不能跨方法或跨作用域引用
- 过度嵌套+标签容易降低可读性,如果嵌套超过三层,建议抽成独立方法再用
return
while 和 do-while 中 continue 的行为差异
在 while 和 do-while 中,continue 都会跳过剩余代码,直接回到条件判断位置。但关键区别在于:前者先判条件再执行,后者先执行再判条件,所以 continue 在 do-while 里可能造成无限空转。
例如这个 bug 写法:
int i = 0;
do {
if (i == 5) continue; // 这里跳过了 i++!
System.out.println(i);
i++;
} while (i < 10);
- 上面代码会卡死,因为当
i == 5时continue直接跳到while (i 判断,而 <code>i没变,条件仍为真 - 所有循环中,
continue不会自动执行更新语句(如i++),这点和 for 循环的第三部分不同 - 如果逻辑复杂,优先用 for 循环,它的初始化、条件、更新三部分位置固定,不容易漏掉变量更新
continue 和 return 混用时的边界问题
在循环体内同时用 continue 和 return 是常见做法,但要注意作用域边界——continue 只影响当前循环,return 却会直接退出整个方法。容易踩的坑是:本想跳过某次迭代,却误写了 return,导致提前终止整个流程。
比如在批量处理任务时:
for (Task task : tasks) {
if (!task.isValid()) {
log.warn("skip invalid task: " + task.id());
continue; // 正确:跳过当前 task
// return; // 错误:整个方法就结束了,后面 task 全被丢弃
}
execute(task);
}
- IDE 一般不会警告这种错误,得靠人工核对逻辑意图
- 如果循环体很长,建议把「跳过条件」集中写在开头,避免
continue散落在各处,增加理解成本 - 某些静态检查工具(如 SonarQube)可以把「循环中无条件 return」设为高危项,值得开启
最常被忽略的是:continue 不改变循环变量本身,它只是控制流跳转。很多人以为它像 for 的自增一样“推进”了循环,结果在 while 里漏掉变量更新,卡住不动。写之前先问一句:这次跳过后,下次循环还能拿到新值吗?









