continue、break和标签
在任何迭代的主体部分都可以使用continue和break控制循环的流程,其中,break用于强行退出循环,不在执行循环中剩余的语句。continue则停止当前的迭代,然后退回循环起始处,开始下一次迭代。
在很多编程语言中,存在goto关键字,其含义是“如条件A成立,则跳到这里,否则跳到那里”。goto语句是在源码级上的跳转,若程序总是从一个地方跳到另外一个地方,程序的流程控制将很难识别,在大部分情况下不推荐使用goto,但是在极少情况下,goto是控制流程的极佳手段。
java中没有goto,但是java中提供了同样的机制:标签。大部分情况下我们都是直接使用continue或break控制循环,continue和break可以和标签一起使用,从而达到goto的效果。
标签是后面跟有冒号的标识符,如lable1:
。在java中,标签起作用的唯一地方是在迭代语句之前。意思是在标签和迭代之间不能置入任何语句,这是因为continue和break关键字通常只能中断当前循环,但若随标签一起使用,它们就会中断循环,回到标签所在的地方。
- (1):中断内部迭代,回到外部迭代,开始外部的下一次迭代
- (2):continue中断当前迭代,开始内部的下一次迭代
- (3):continue label1同时中断内部迭代和外部迭代,直接转到label1处,随后继续开始外部迭代。比如外部for(int i=0;i<10;i+++)循环,迭代到i=5了,continue label1后,中断内外部迭代,回到label1处继续执行迭代,但是i从6开始。
- (4):break label1也会同时中断内外部迭代,但是并不重新进入迭代,直接执行(5)后面的代码,也就是说它实际是完全中止了两个迭代1234567891011121314151617181920public static void main(String[] args){outer:for(int i=0;i<5;i++){System.out.println("i="+i);inner:for(int j=0;j<10;j++){System.out.println("j="+j);if(j==3){continue inner;}/*if(j==4){continue outer;}*/if(j==5){break outer;}}}System.out.println("执行结束");}
执行上面的代码,打印结果如下
从上面的打印可以看出,j=3时continue inner实际和continue没有差别,都是中止当前迭代,继续下一个迭代。当j=5时,break outer;直接中止了两个迭代,执行了“执行结束”打印,程序结束
解开上面代码中的注释部分,再次执行,打印结果如下:
从上面的打印可以看出,j=5永远都执行不到,因为j=4是就中止了当前迭代,跳到outer标签处,开始外层的下一次迭代,所以外层迭代是执行完成了的,最终i=4。