请解释标签语句的用法
- 是否打破并继续使用Java中标记语句的唯一用途?
- 您何时在程序中使用了Labeled Statements?
很抱歉,代码段已被删除。 我正在分裂这个问题
JLS 14.7标记语句
(为清晰起见编辑)
语句可能有标签前缀( 标识符 : 语句 )。 标识符被声明为直接包含的Statement的标签。
与C和C ++不同,Java编程语言没有
goto
语句; 标识符语句标签与出现在标签语句中任何位置的break
( §14.15 )或continue
( §14.16 )语句一起使用。
因此,JLS很清楚标签与break
或continue
,并且Java编程语言中没有其他语法元素使用它。
严格来说, break
和continue
,无论是否标记,都是绝对必要的。 它们总是可以写出代码。 然而,使用惯用语,它们可以导致更易读的代码。
这是一个说明性的例子:给定一个int[]
,我们希望:
- 在
1
上打印"One (1)"
- 在
2
上打印"Two (2)"
- 在
0
上打印"Zero "
-
立即停止处理任何其他号码
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
中处理不同的号码 -
switch
未标记的break
用于避免情况之间的“跌落” - 标记
continue loop;
用于跳过case 0:
后处理case 0:
此处不需要标签) - 标记的
break loop;
用于在default:
终止循环default:
这里需要标签;否则它是一个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
情况,不是在迭代语句中使用,而是在简单的块语句中使用。 有人可能会说这些标签会带来更好的可读性; 这一点是主观的。
不,最后一行不会给出编译时错误。 它实际上受到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; } } }