最近面试,遇上一道题,如下:
public void test(){
int a=0;
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
//直接跳出双层循环
}
}
//跳出到这里
int b=1;
}
当时在想,怎么一句话就跳出到指定位置,也是自己钻牛角了,return的话,直接就结束了,break的话,只能跳出一层,continue只是中断当前,于是回想到goto,在JAVA中的标签。
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(1);
i=100;
break;
}
System.out.print(2);
}
System.out.print(3);
输出为: 1 2 3 显然单纯的break加逻辑判定,达不到上述的要求,外面的循环会再走一次。
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(1);
i=100;j=10;
continue;
}
System.out.print(2);
}
System.out.print(3);
输出为: 1 2 3 使用continue跟test1:一样
标签加continue
labe:for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println(1);
i=100;
continue labe;//跳出整个循环
}
System.out.println(2);
}
System.out.print(3);
输出为: 1 3
标签加break
labe:for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println(1);
break labe;//跳出整个循环
}
System.out.println(2);
}
System.out.print(3);
输出为: 1 3 都可以达到要求,于是我在想,可能面试的时候有些东西不能被限制在纸面上,也需有更好的答案,不能拘泥于问答,于是想到提炼方法。
private void for1(){
for(int i=0;i<10;i++){
for(int a=0;a<10;a++){
System.out.println(1);
return;
//System.exit(0)
}
System.out.println(2);
}
}
new T().for1();
System.out.print(3);
输出为: 1 3
于是额外测试了一下System.exit(0) (或者别的参数),发现输出都为: 1
发现大神们讲的不错
1,如果在main方法中System.exit(0)与return没有区别,都是终止程序。
2,如果是别的方法,那System.exit(0)直接之中程序,就算后面有代码也不执行,而return则返回至调用该方法的地方,如果 后面还有代码将继续执行。
但是我感觉两者定义之间有本质的不同,对于JAVA程序而言,运行System.exit()会终止JVM。对于参数的解释:非零状态码指示异常终止,零状态是终止整个程序。不同参数两者的区别是返回值不同:exit(x) -- x<>0通常是返回错误码;exit(x) -- 通常是退出程序。
而return 作为关键字有两个定义:
1,指定一个方法返回什么值(假设它没有void返回值);
2,会导致当前的方法退出,并返回那个值。
如果在返回void的方法中没有一个return语句,那么在该方法的结尾处会有一个隐式的return,因此在方法中并非总是必须要有一个return语句。但是如果一个方法声明它将返回void之外的其他东西,那么必须确保每一条代码路径豆浆返回一个值。
言归正传,对于循环而言:
1,一般continue会退回最内层循环的开头(顶部),并继续执行。
2,带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
3,一般break会中断并跳出当前循环。
4,带标签的break会中断并跳出标签所指定的循环。
重点:JAVA里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue。
欢迎拍砖,如果你有更好的方法。希望你能留言。