4.4 break、continue、return 与标签
前置知识:while、for 和嵌套循环
预计时间:25 分钟
完成标志:能准确指出控制转移的目标和下一步位置
break 结束最近的循环或 switch
int foundAt = -1;
for (int position = 0; position < 100; position++) {
if (position == 7) {
foundAt = position;
break;
}
}
System.out.println(foundAt); // 7无标签 break 只结束最内层的循环或 switch,执行从该结构之后继续。它不会自动退出整个方法。
continue 跳过本轮剩余部分
for (int number = 1; number <= 10; number++) {
if (number == 5) {
continue;
}
System.out.println(number);
}输出没有 5。
在 for 中,continue 转到更新表达式,再检查条件。在 while 中,它转到条件检查:
int number = 0;
while (number < 10) {
number++;
if (number == 5) {
continue;
}
System.out.println(number);
}若把 number++ 移到整个 if 块之后,命中 5 时 continue 会跳过更新,循环便卡在 5。
return 退出整个方法
static int findFirst(int[] values, int target) {
for (int index = 0; index < values.length; index++) {
if (values[index] == target) {
return index;
}
}
return -1;
}return 不只是跳出循环,它结束当前方法调用。方法中的 finally 和 try-with-resources 清理仍按 Java 规则执行;不要把 return 理解成“立即跳过所有清理”。
标签可以跨出多层结构
int foundRow = -1;
int foundColumn = -1;
search:
for (int row = 0; row < 3; row++) {
for (int column = 0; column < 3; column++) {
if (row == 1 && column == 2) {
foundRow = row;
foundColumn = column;
break search;
}
}
}break search; 跳出标记为 search 的整个语句。Java 标签可以标在语句前;带标签 continue 的目标则必须是循环语句,并开始该外层循环的下一次迭代。
nextRow:
for (int row = 0; row < 3; row++) {
for (int column = 0; column < 3; column++) {
if (column == 1) {
continue nextRow;
}
System.out.println(row + "," + column);
}
}标签是合法工具,但嵌套搜索常可提取为方法并使用 return,或拆成更清晰的数据操作。标签名应表达目标,如 search,不要使用 outer1 之类位置名称。
C++ 没有 Java 式带标签 break
C++ 有 goto 标签,但不支持 break outer; 或 continue outer;。退出多层循环通常使用函数返回、状态变量、算法抽象,或在受控情形下使用 goto。语法相似不等于控制转移能力相同。
Python 也没有带标签 break。它可通过函数 return、循环 else、辅助函数或异常等结构表达多层退出。
少用 continue 隐藏主路径
过滤无效项时,早 continue 能减少嵌套:
for (Order order : orders) {
if (!order.isValid()) {
continue;
}
process(order);
}但一轮中有多个分散的 continue 时,状态更新和资源操作可能被跳过。把每轮工作提取成方法,或先过滤数据,常更容易验证。
专业速查
| 关键字 | 影响范围 | 下一步 |
|---|---|---|
break | 最近循环或 switch | 结构之后 |
continue in for | 当前轮 | 更新表达式,再检查条件 |
continue in while | 当前轮 | 检查条件 |
return | 当前方法调用 | 返回调用者 |
break label | 指定的外层带标签语句 | 该语句之后 |
continue label | 指定的外层循环 | 下一轮 |
离开这一页前
面对两层循环,分别画出无标签 break、continue、方法 return 和 break search 的下一步位置。带标签 continue 还要确认目标确实是循环。若一种退出方式需要长篇注释才能说明,先尝试提取方法或改写数据遍历。