跳到内容

第 1 卷 / 第 4 章 / 第 4 课

4.4 break、continue、return 与标签 ​

前置知识:while、for 和嵌套循环

预计时间:25 分钟

完成标志:能准确指出控制转移的目标和下一步位置

break 结束最近的循环或 switch ​

java
int foundAt = -1;

for (int position = 0; position < 100; position++) {
    if (position == 7) {
        foundAt = position;
        break;
    }
}

System.out.println(foundAt); // 7

无标签 break 只结束最内层的循环或 switch,执行从该结构之后继续。它不会自动退出整个方法。

continue 跳过本轮剩余部分 ​

java
for (int number = 1; number <= 10; number++) {
    if (number == 5) {
        continue;
    }
    System.out.println(number);
}

输出没有 5。

在 for 中,continue 转到更新表达式,再检查条件。在 while 中,它转到条件检查:

java
int number = 0;
while (number < 10) {
    number++;
    if (number == 5) {
        continue;
    }
    System.out.println(number);
}

若把 number++ 移到整个 if 块之后,命中 5 时 continue 会跳过更新,循环便卡在 5。

return 退出整个方法 ​

java
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 理解成“立即跳过所有清理”。

标签可以跨出多层结构 ​

java
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 的目标则必须是循环语句,并开始该外层循环的下一次迭代。

java
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 能减少嵌套:

java
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 还要确认目标确实是循环。若一种退出方式需要长篇注释才能说明,先尝试提取方法或改写数据遍历。

→ 下一步:控制流实验

规范入口:JLS §14.15–14.17:break、continue 与 return。

Built with VitePress | Software Systems Atlas