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循环的例子:
分析,第一个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中,整个循环流程结束。
所以,最终输出应该为:
以下示例是break和continue在while循环中的使用:
分析方式同上面的分析流程。这里不再逐步分析,输出结果为:
所以,最后总结为:
一般的continue会退回到它所归属的循环的开头,并继续执行;
带标签的continue会到达标签的位置,并重新进入紧接在那个标签后边的循环;
一般的break会中断并跳出当前循环,如果当前循环里有内嵌循环,则一并跳过,不再进入;
带标签的break会中断并跳出标签所指的循环,如果此标签为最外层循环的起始处,那么则会跳过所有循环。