不带标签的break和continue只能中断最内层循环|退回最内层循环的顶部,就没有办法从内部循环里跳出外部循环。
尽管JAVA中goto是一个保留字,但在JAVA中并未使用它,这种设计提高了程序流程控制的可读性,但是也有不好的地方,它降低了程序流程控制的灵活性。其实,JAVA也可以完成一些类似于跳转的操作,那就是将break和continue配合标签一起使用。
标签是后面跟有冒号的标识符,就像下面这样:
label:
在JAVA中,标签起作用的主要地方是在循环语句之前。“之前”的意思是在标签和循环语句之间不置入任何语句。而在循环语句之前设置标签的唯一理由是:在多重嵌套循环中方便退出循环。这是由于break和continue关键字通常只中断当前循环,但若随同标签一起使用,它们就会中断循环,直到标签所在的地方:
下面是标签用于for循环的例子:
public static void main(String[] args){
int i = 0;
outer:
for(;true;){
inner:
for(;i<10;i++){
System.out.println("i="+i);
/**在抵达for循环的末尾之前,递增表达式会执行*/
if(i==2){
System.out.println("continue");
continue;
}
/**break会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。由于
* break跳过了增量表达式,所以在此处直接对i进行递增操作*/
if(i==3){
System.out.println("break");
i++;
break;
}
/**continue outer语句会跳到循环顶部,并且跳过inner标签下的for循环的递增,
* 所以这里也对i直接递增*/
if(i==7){
System.out.println("continue outer");
i++;
continue outer;
}
if(i==8){
System.out.println("break outer");
break outer;
}
/**在抵达inner标签下的for循环末尾之前,inner下的for循环的递增表达式会执行*/
for(int k = 0;k< 5;k++){
if(k==3){
System.out.println("continue inner");
continue inner;
}
}
}
}
事实上,可以将带标签的break应用到任何语句中,可以应用到if语句或者块语句中,只需将标签放在想要跳到的语句块之前并与break配合使用即可。
注意:带标签的break只能跳出语句块,但不能跳入语句块。
public static void main(String[] args){
label:
if(true) {
System.out.println("Inside IF");
break label;
}
System.out.println("Outside IF");
}