对不起,代码段已被删除。我正在拆分问题
(为清楚起见编辑)
Statement可能带有标签前缀(Identifier:Statement)。声明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:
的后处理(这里不需要标签)break loop;
用于终止default:
上的循环(此处需要标签is;否则为switch break
)]因此标记为break
/ continue
的代码也可以在嵌套循环之外使用;当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难题22:URL重复的启发。不幸的是,这个谜题并没有更深入地“正确”使用带标签的语句。
是,break
和continue
是Java中带标签语句的仅有的两种用法。 (Java没有goto
语句。)
您可以使用标签打破嵌套循环。
outer:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.println("Hello");
continue outer;
} // end of inner loop
System.out.println("outer"); // Never prints
}
System.out.println("Good-Bye");
[当您将continue
返回到outer
标签时,您将跳过内循环和外循环的其余部分,包括打印语句。
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length; j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search;
}
}
}