[JLS
14.7带标签的语句](https://docs.oracle.com/javase/specs/jls/se14/html/jls-14.html#jls-14.7)
(为清楚起见进行了编辑)
语句 可能具有标签前缀( Identifier : Statement )。该 标识符 被声明为直接包含的标签 声明 。
与C和C
++不同,Java编程语言没有goto语句。标识符语句标签与break(§14.15)或continue(§14.16)语句一起出现在带标签的语句中的任何地方。
因此,JLS很清楚,标签与
break或一起使用
continue,并且Java编程语言中没有其他语法元素使用它。
严格来说,
break和
continue,是否标记都 没有 必要。它们总是可以用代码写出来。但是,惯用语会导致代码更具可读性。
这是一个说明性示例:给定
int[],我们想要:
- 打印
"One (1)"
在1
- 打印
"Two (2)"
在2
- 打印
"Zero "
在0
- 立即停止处理其他任何号码
int[] arr = { 1, 2, 0, 1, -1, 0, 2 };loop:
for (int num : arr) {
switch (num) {
case 1:
System.out.print(“One “);
break;
case 2:
System.out.print(“Two “);
break;
case 0:
System.out.print(“Zero “);
continue loop;
default:
break loop;
}
System.out.print(“(” + num + “) “);
}
// prints “One (1) Two (2) Zero One (1) “
在这里,我们看到:
- 不同的数字在一个
switch
- 未标记
break
在switch
用于避免“落空”情况之间 - 带标签
continue loop;
的用于跳过后处理case 0:
(此处无需标签) - Labeled
break loop;
用于终止循环default:
(在这里标签 是 必需的;否则为switch break
)
因此,标记为
break/的代码
continue也可以在嵌套循环之外使用;当a
switch嵌套在循环中时可以使用它。更一般而言,在可能有多个
break/
continue目标并且您希望选择一个不立即包含
break/
continue语句的目标时使用它。
这是另一个例子:
morningRoutine: { phase1: eatBreakfast(); if (grumpy) break morningRoutine; phase2: kissWife(); phase3: hugChildren(); } http://stackoverflow.com is the best website ever!这是带标签的另一种情况,
break它不在迭代语句中使用,而是在简单的block语句中使用。有人可能会说标签带来更好的可读性。这一点是主观的。
不,最后一行不给出编译时错误。它实际上是受 Java Puzzlers Puzzle
22:URL重复的启发。不幸的是,这个谜题并没有更深入地“正确”使用带标签的语句。



