在任何迭代的主体部分都可以使用continue和break控制循环的流程,其中,break用于强行退出循环,不在执行循环中剩余的语句。continue则停止当前的迭代,然后退回循环起始处,开始下一次迭代。

在很多编程语言中,存在goto关键字,其含义是“如条件A成立,则跳到这里,否则跳到那里”。goto语句是在源码级上的跳转,若程序总是从一个地方跳到另外一个地方,程序的流程控制将很难识别,在大部分情况下不推荐使用goto,但是在极少情况下,goto是控制流程的极佳手段。

java中没有goto,但是java中提供了同样的机制:标签。大部分情况下我们都是直接使用continue或break控制循环,continue和break可以和标签一起使用,从而达到goto的效果。

标签是后面跟有冒号的标识符,如lable1:。在java中,标签起作用的唯一地方是在迭代语句之前。意思是在标签和迭代之间不能置入任何语句,这是因为continue和break关键字通常只能中断当前循环,但若随标签一起使用,它们就会中断循环,回到标签所在的地方。

1
2
3
4
5
6
7
8
9
10
11
12
13
label1:
outer-iteration{
inner-iteration{
break;//(1)
....
continue;//(2)
...
continue label1;//(3)
...
break label1;//(4)
}
}
//执行其他语句(5)

  • (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)后面的代码,也就是说它实际是完全中止了两个迭代
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public 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("执行结束");
    }

执行上面的代码,打印结果如下

1
2
3
4
5
6
7
8
i=0
j=0
j=1
j=2
j=3
j=4
j=5
执行结束

从上面的打印可以看出,j=3时continue inner实际和continue没有差别,都是中止当前迭代,继续下一个迭代。当j=5时,break outer;直接中止了两个迭代,执行了“执行结束”打印,程序结束

解开上面代码中的注释部分,再次执行,打印结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
i=0
j=0
j=1
j=2
j=3
j=4
i=1
j=0
j=1
j=2
j=3
j=4
i=2
j=0
j=1
j=2
j=3
j=4
i=3
j=0
j=1
j=2
j=3
j=4
i=4
j=0
j=1
j=2
j=3
j=4
执行结束

从上面的打印可以看出,j=5永远都执行不到,因为j=4是就中止了当前迭代,跳到outer标签处,开始外层的下一次迭代,所以外层迭代是执行完成了的,最终i=4。