前言
最近在看一些源码的过程中发现使用了标签,当时竟然看不懂,在搜索了一下之后才发现这是 java 标签的用法。这在平时工作中很少用到,甚至都记不起来 java 还有这一个特性。所以,趁着这次机会,把 java 标签复习和记录一下,以便后续再出现类似的情况时能快速找到资料进行复习。
java 标签的形式
java 标签是由一个字符串名称和一个冒号组成的标识符,如:label:
。其唯一其作用的地方是刚好在迭代语句之前。也就是说,在标签和迭代语句之间不能有任何其他的代码,如下所示
1 2 3 4 5
| label: while (condition) {}
label: for (condition)
|
java 标签的作用
java 标签只有配合迭代语句一起使用才能发挥作用,这也是其唯一其作用的地方。其主要作用是用于控制循环的跳转和中断循环。当然,这两个功能单独由 continue
和 break
语句也能做到。但是单独地使用 continue
和 break
语句只是针对一个循环的,并不能控制外层的嵌套循环的跳转。如果将 java 标签和 continue
、break
语句结合使用,就能控制外层嵌套的循环跳转,而这也正是 java 标签的独特之处。
java 标签的用法
java 标签是放在循环语句之前,与 continue
和 break
语句相结合使用的。其形式如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| outerLabel: outer-iteration { ... innerLabel: inner-iteration { ... continue innerLabel; ... break innerLabel; ... continue outerLabel; ... break outerLabel; ... } ... }
|
java 标签的样例
以下是使用 java 标签的样例。有 10 此外层循环和 3 次内层循环。为了方便观察验证 continue 和 break 的区别,每次执行到第二次内层循环时,进行相应的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class TestLabel { public static void main(String[] args) { System.out.println("====Begin===="); outerLoop: for (int i = 0; i < 10; i++) { innerLoop: for (int j = 0; j < 3; j++) { if (i == 1 && j == 1) { System.out.println("i = " + i + ", j = " + j + " -- continue innerLoop"); continue innerLoop; } if (i == 2 && j == 1) { System.out.println("i = " + i + ", j = " + j + " -- break innerLoop"); break innerLoop; } if (i == 3 && j == 1) { System.out.println("i = " + i + ", j = " + j + " -- continue outerLoop"); continue outerLoop; } if (i == 4 && j == 1) { System.out.println("i = " + i + ", j = " + j + " -- break outerLoop"); break outerLoop; } System.out.println("i = " + i + ", j = " + j); } System.out.println("------------"); } System.out.println("====End===="); } }
|
样例输出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ====Begin==== i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 ------------ i = 1, j = 0 i = 1, j = 1 -- continue innerLoop i = 1, j = 2 ------------ i = 2, j = 0 i = 2, j = 1 -- break innerLoop ------------ i = 3, j = 0 i = 3, j = 1 -- continue outerLoop i = 4, j = 0 i = 4, j = 1 -- break outerLoop ====End====
|
从输出结果可以看出:continue label
语句会直接跳过循环中该语句后面的部分,直接跳到 label 处,执行下一个循环,而 break label
语句会直接跳过循环中该语句后面的部分,直接跳到 label 处,然后结束循环,执行循环块后面的代码。
总结
- java 标签必须与循环语句使用,是循环语句的前面一个语句,才能发挥其效果。
continue label
语句会跳过循环块中后面的语句,直接跳到 label
处,然后执行下一个循环。
break label
语句会跳过循环块中后面的语句,直接跳到 label
处,然后结束循环,执行循环代码块后面的语句。
- 在嵌套循环中,要在内部循环中直接控制外部循环的跳转,使用 java 标签语句可以更加简洁清晰地完成功能,特别是对于嵌套了多层内部循环的情况下更能体现其威力。
- 引申一下,可以设想每个循环都有一个标签(没写的系统默认补上),单独使用
continue
语句就是使用 continue label
语句(系统自动转换),单独使用 break
语句就是使用 break label
语句(系统自动转换),其效果是完全一样的。
参考资料
[1] Eckel,B. Java编程思想(第四版)[M]. 北京:机械工业出版社,2007.6