最近在复习线程相关的知识,阅读源码时看到有使用以下语法:
此处的retry 及 break retry 和 continue retry 到底起到了什么作用?
首先自己先写一段代码验证下
public static void main(String[] args) {
int j = 0;
outer:
for (;;) {
System.out.println("outer");
inner:
for (; ; j++) {
System.out.println("inner");
System.out.println("j = " + j);
if (j == 3){
continue ;
}
if (j == 4){
j++;
break ;
}
if (j==5){
System.out.println("continue inner");
continue inner;
}
if (j==6){
j++;
System.out.println("break inner");
break inner;
}
if (j==8){
System.out.println("continue outer");
j++; //此处不会执行for条件的i++,所以须自己+1,否则会无限循环
continue outer;
}
if (j==9){
System.out.println("break outer");
break outer;
}
}
}
System.out.println("over");
}
运行结果如下:
outer
inner
j = 0
inner
j = 1
inner
j = 2
inner
j = 3
inner
j = 4
outer
inner
j = 5
continue inner
inner
j = 6
break inner
outer
inner
j = 7
inner
j = 8
continue outer
outer
inner
j = 9
break outer
over
一步步分析下执行流程:
1.首先进入外层循环,打印outer
2.进入里层循环,打印inner
3.此时j的值为0,且打印j的值
4.里循环以此打印j为1,2的值
5.当j=3时,继续里层循环,(不执行当前循环代码块中剩余的逻辑)
6.当j=4时,自行将j+1,此处不自行+1的话,会导致死循环,且跳出内循环
7.外层循环开始,打印outer
8.里层循环开始,打印inner及j值(此时j的值为5)
9.打印continue inner且继续里层循环,其实此处与直接写continue作用一致
10,打印break inner且跳出内循环,与break作用一致
11.继续循环打印j值
12.当j的值为8时,继续外层循环,(不执行外循环代码块中剩余的逻辑)
13.当为9时,直接结束外层循环
在此处,有明显使用意义的是对外层循环的操作,即continue outer和break outer
只有在有嵌套循环的地方才有使用循环标签的意义
其次在内循环的break 和 continue outer有点相,如果在外层循环中的内循环代码块结束之后无其他执行代码,作用一致,否则有极大区别
在内循环结束后加上其他执行代码
for (;;) {
for (; ; j++) {
...
...
}
System.out.println("outer others");
}
当j为4和8时执行结果
//j=4
j = 4
outer others
outer
inner
//j=8
j = 8
continue outer
outer
inner
总结
之前在代码中写嵌套循环,对于外层循环的操作都是加标志位进行标识,当了解了循环中标签的使用后,将极大简化代码