同事重温Java的时候看到了一段下面这样的代码,他问我知不知道这个是什么。时间久了,又不常用,这我可记不住,你能回想起来这是什么吗?
public class TagLoopTest {
public static void main(String[] args) {
outerLoop:
for (int i = 1; i <= 3; i++) {
System.out.println("Outer loop iteration: " + i);
innerLoop:
for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
// 跳出内层循环
System.out.println("Breaking inner loop at i=" + i + ", j=" + j);
continue innerLoop;
}
if (i == 3) {
// 跳出外层循环
System.out.println("Breaking outer loop at i=" + i);
break outerLoop;
}
System.out.println("Inner loop iteration: " + j);
}
}
System.out.println("Loops completed.");
}
}
即使可能回想不起来,但是代码的运行结果应该是能够猜出来的,运行结果如下,看看是否跟你猜想的一样。
Outer loop iteration: 1
Inner loop iteration: 1
Inner loop iteration: 2
Inner loop iteration: 3
Outer loop iteration: 2
Inner loop iteration: 1
Breaking inner loop at i=2, j=2
Inner loop iteration: 3
Outer loop iteration: 3
Breaking outer loop at i=3
Loops completed.
goto
学过C语言的网友可能会发现,这不就类似于C语言中的goto吗?的确是。可能有些人不熟悉goto语句,这里简单介绍一下。
在C语言中,goto 是一种控制流语句,它允许直接跳转到程序中的另一个位置。使用 goto 可以跳转到同一函数内的标记(标签)处,从而实现非常灵活的控制流程。然而,goto 语句在结构化编程理念中被视为一种不良实践,因为它可能导致程序结构混乱和难以理解,使得代码难以维护和调试。
goto label;
// 标签处
label:
// 代码块
是不是跟上面的代码特别像,不同的是在Java中,goto不是关键字。

好了,说了那么多了,该揭晓一下正主了。上面代码中的写法在Java中被称为带有标签的循环。
带有标签的循环
带有标签的循环(也称为标签化循环) 是一种特殊的循环结构,它允许你使用 break 和 continue 关键字配合一个标识符(标签),从而更灵活地控制循环的执行流程,这种结构特别适用于多层嵌套循环的情况,比如可能需要从内层循环直接跳转到外层循环的特定点。。
语法
语法如下:
labelName: // 这里是标签
for (initialization; condition; increment) {
// 循环体
if (someCondition) {
break labelName; // 使用标签的 break 语句跳出至指定的标签处
}
if (anotherCondition) {
continue labelName; // 使用标签的 continue 语句跳回至指定的标签处并重新开始循环
}
}
需要注意的是:
- 标签可以是任意合法的标识符,但最好选择有意义的名称以便于代码阅读。标签后面要跟着一个冒号(
:)。 - 标签必须紧贴在循环语句之前,并且只能用于循环语句(
for、while、do-while)。
总结
虽然Java允许在循环语句前加上标签并使用 break 或 continue 语句来跳转到指定标签处,但这种做法通常被认为是一种不良的编码习惯,而且可能影响代码的可读性和维护性。所以实际工作中并不建议使用带有标签的循环 ,如果真的想使用了,优先考虑一下是否有替代或者重构代码。