java基础-流程控制-迭代关键字(return,break,continue,label)

在java中有许多关键词表示无条件分支,它们只是表示这个分支无需任何测试即可发生。这些关键词包括:

return,break,continue和一种和goto类似的跳转到标号语句的方式的关键字:label(标签)

 

1.return:return关键字有两方面的用途,一方面指定一个方法的返回值,另一方面它会导致当前方法的退出,并返回那个值。

如果在返回void方法中没有return语句,那么在该方法的结尾处有一个隐式的return。因此在方法中并非总是必须要有一个return语句。

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

 

无穷循环的两种形式为while(true)和for(;;),在这两个循环里面使用break都可以终止循环。

 

3.break和continue是中断迭代的一种方法,它们使用了相同的机制:标签

标签(label):标签是后面跟有冒号的标志符,例如:label1:

在java中,需要使用标签的唯一理由就是因为嵌套循环的存在,而想从多层嵌套中break和continue出来。并且,标签起作用的唯一地方刚好是在迭代语句之前。即:

label1:

for(initialization;Boolean-expression;step){

           label2:

           for(initialization;Boolean-expression;step){

                  statement;

           }

}

类似的情况。

由于break和continue通常只中断当前循环,但若随同标签一起使用,它们就会中断循环,直到标签所在的地方。例如:

label1:

outer-iteration{

   inner-iteration{

       ...

      break;//(1)

      ...

      continue;//(2)

      ...

     continue label1//(3)

     ...

     break label1//(4)

   }

}

分析:在(1)中,break中断内部迭代,回到外部迭代。

           在(2)中,continue使执行点移回内部迭代的起始处。

           在(3)中,continue label1同时中断内部迭代以及外部迭代,直接转到label1处,随后,它实际上是继续迭代的过程,但却从外部迭代开始。

           在(4)中,break label1也会中断所有迭代,并回到label1处,但并不重新进入迭代。也就是说,它实际是完全终止了两个迭代。

下面演示一个标签用于for循环的例子:

java基础-流程控制-迭代关键字(return,break,continue,label)

分析,第一个for循环是一个无穷循环,它设置了一个外部标签outer,内部for循环前面设置了一个内部标签inner,然后有第三个普通for循环。程序执行流程:

1:i=0,打印i=0,执行到循环3里,当k=3时,打印continue inner后,跳到内部标签inner处,i递增为1,判断其小于10,执行循环2的下一次迭代;

2:i=1,打印i=1,执行到循环3里,当k=3时,打印continue inner后,跳到内部标签inner处,i递增为2,判断其小于10,执行循环2的下一次迭代;

3:i=2,打印i=2,i=2时,循环2中有做判断,打印continue后,i递增为3,判断其小于10,执行循环2的下一次迭代;

4:i=3,打印i=3,i=3时,循环2中有做判断,打印break后,跳出循环2,开始执行循环1的下一次迭代。由于循环1中没有内容,直接开始进入循环2。注意:由于循环2中没有初始化表达式,即i不会重新初始化为0,所以第三步中break中断了循环2,而在抵达循环的末尾之前,递增表达式不会执行,所以此次进入循环2后,i还是等于3,如果不在此处break之前直接对i进行递增操作,那么i将一直会是3,那么整个流程将一直循环第4步的内容。所以,此处对i进行递增一次,i=4;

5:i=4,打印i=4,执行到循环3里,当k=3时,打印continue inner后,跳到内部标签inner处,i递增为5,判断其小于10,执行循环2的下一次迭代;

6:i=5;打印i=5,执行到循环3里,当k=3时,打印continue inner后,跳到内部标签inner处,i递增为6,判断其小于10,执行循环2的下一次迭代;

7:i=6;打印i=6,执行到循环3里,当k=3时,打印continue inner后,跳到内部标签inner处,i递增为7,判断其小于10,执行循环2的下一次迭代;

8:i=7;打印i=7,执行到循环2里,判断i=7时,打印continue outer,跳到循环1lable1处,由于是continue,所以会再次进入循环1,随后进入循环2,此处和第4步一样,continue outer 跳过了i的递增,如果不对它进行递增一次的话,i会一直为7,整个流程会重复第8步的内容。所以,对i递增,i=8;

9:i=8;打印i=8,执行到循环2里,判断i=8时,打印break outer,跳到循环1lable1处,由于是break,所以不会再次进入循环1中,整个循环流程结束。

所以,最终输出应该为:

java基础-流程控制-迭代关键字(return,break,continue,label)

以下示例是break和continue在while循环中的使用:

java基础-流程控制-迭代关键字(return,break,continue,label)

分析方式同上面的分析流程。这里不再逐步分析,输出结果为:

java基础-流程控制-迭代关键字(return,break,continue,label)

所以,最后总结为:

一般的continue会退回到它所归属的循环的开头,并继续执行;

带标签的continue会到达标签的位置,并重新进入紧接在那个标签后边的循环;

一般的break会中断并跳出当前循环,如果当前循环里有内嵌循环,则一并跳过,不再进入;

带标签的break会中断并跳出标签所指的循环,如果此标签为最外层循环的起始处,那么则会跳过所有循环。