如何跳出当前的多重循环?

最近看到一个笔试题:
如何跳出当前的多重循环?
但是看到好多的答案:break,return,觉得这个答案似乎有些不妥

于是仔细推导一番

首先,不建议使用return跳出循环,题目也说到了是多重循环,
如果使用return的话,会跳出整个函数,那后续的代码岂不是无法执行

所以在这里,整理了一下自己的看法,
目前了解到的一些循环有for,while,do while,switch
下面一一说明
public static void main(String[] args) {

//使用break,或者标记break
ok:for(int i=0;i<10;i++){
System.out.println("xxx");
for(int j=0;j<10;j++){
if(j>2)
break;//==return;
System.out.println(j);
}
}
这里需要说明的是,ok是用来标记跳出哪一个循环
当ok标记在第一层(最外层)循环的时候,相当于return的功能,跳出整个循环
"xxx"只会输出一次
而当ok标记在第二层的时候,将相当于break的功能,只跳出当前的循环
而"xxx"会在不执行第二层的情况下,完成第一层的循环
for(int i=0;i<10;i++){
System.out.println("xxx");
ok:for(int j=0;j<10;j++){
if(j>2)
break ok;//==break;
System.out.println(j);
}
}


//使用自定义的boolean变量,配合循环条件一起共同满足方可执行循环
//另外需要注意的时候,在跳出条件成立时,不仅设置flag的值,同时也要加上break


这里需要说明的是,!flag是用来标记跳出哪一个循环
当!flag标记在第一层(最外层)循环的时候,如果跳出条件成立,则会关闭第一层的循环
相当于return;的功能
boolean flag=false;
for(int i=0;i<5&&!flag;i++){
System.out.println("xxx");
for(int j=0;j<5;j++){
if(j>2){
flag=true;break;
//上面两句的功能等价于 return;
}
System.out.println(j);
}
}

当!flag标记在第二层的时候,
程序会先执行一次"xxx",然后再执行第二层循环,当跳出条件成立时,就关闭当前的循环
而下一次循环时,只会执行第一层的循环,记住,这个!flag是关闭循环,而不是跳出
boolean flag=false;
for(int i=0;i<5;i++){
System.out.println("xxx");
for(int j=0;j<5&&!flag;j++){
if(j>2){
flag=true;
break;
}
System.out.println(j);
}
}

最后一种才是所谓的break,由一层循环开始,到第二层。
当跳出条件成立,就跳出当前的循环,
继而又从一层开始循环,在到第二层,又等到跳出条件成立,从一层开始
周而复始
for(int i=0;i<5;i++){
System.out.println("xxx");
for(int j=0;j<5;j++){
if(j>2){
break;
}
System.out.println(j);
}
}

另外,对于while和switch都可使用标记,但是貌似switch目前还不会用boolean值做条件

int i=0;
ok:while(true){
i++;
System.out.println(i);
if(i==5)
break ok;
}

int i=0;
boolean flag=false;
while(true&&!flag){
i++;
System.out.println(i);
if(i==5)
flag=true;
}


int i=0;
ok:do{
i++;
System.out.println(i);
if(i==5)
break ok;
}while(true);

int i=0;
boolean flag=false;
do{
i++;
System.out.println(i);
if(i==5)
flag=true;
}while(true&&!flag);

貌似 switch只能用标记吧
int x=3;
ok:switch(x){
case 1:
x*=10;
break;
case 2:
x*=10;
break;
case 3:
x*=10;
break ok;
case 4:
x*=10;
break;
default:
x=0;
}
System.out.println(x);

原文地址:https://www.cnblogs.com/javawebsoa/p/3067719.html