- 打破并继续 Java 中标记语句的唯一用途?
- 你什么时候在你的程序中使用过标签语句?
抱歉,代码片段已被删除。我正在拆分问题
抱歉,代码片段已被删除。我正在拆分问题
(为清楚起见进行了编辑)
语句可能有标签前缀(Identifier : Statement)。Identifier被声明为立即包含的Statement的标签。
与 C 和 C++ 不同,Java 编程语言没有
goto
语句;标识符语句标签与出现在标记语句中的任何位置的break
( §14.15 ) 或continue
( §14.16 ) 语句一起使用。
所以 JLS 很清楚标签与break
or一起使用continue
,Java 编程语言的其他语法元素都没有使用它。
严格来说,break
and 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:
(此处需要标签;否则为aswitch break
)所以标记break
/continue
也可以在嵌套循环之外使用;它可以在 aswitch
嵌套在循环中时使用。更一般地说,它在可能有多个break
/continue
目标时使用,并且您想选择一个不立即包含break
/continue
语句的目标。
这是另一个例子:
morningRoutine: {
phase1: eatBreakfast();
if (grumpy) break morningRoutine;
phase2: kissWife();
phase3: hugChildren();
}
http://stackoverflow.com is the best website ever!
这是另一个没有在迭代语句中使用标签的情况break
,而是在简单的块语句中使用。有人可能会争辩说,标签会带来更好的可读性;这一点是主观的。
不,最后一行不会给出编译时错误。它实际上是受到Java Puzzlers Puzzle 22: Dupe of 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
标签时,您将跳过内部和外部循环的其余部分,包括 print 语句。
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;
}
}
}