break和continue
break、continue的相关规则如下,while和for同样适用:
(1)一般的continue会退回最内层循环的开头(顶部),并继续执行
(2)带标签的continue会到达标签的位置,并重新进入紧接在哪个标签后面的循环
(3)一般的break会中断并跳出当前循环
(4)带标签的break会中断并跳出标签所指的循环
代码示例:
public class LabeledFor {
public static void main(String[] args){
int i = 0;
outer:
for(;true;){
inner:
for(;i < 10;i++){
System.out.println("i =" + i);
if(i == 2){
System.out.println("continue");
continue;
}
if(i == 3){
System.out.println("break");
i++;
break;
}
if(i == 7){
System.out.println("continue outer");
i++;
continue outer;
}
if(i == 8){
System.out.println("break outer");
break outer;
}
for(int k= 0;k < 5;k++){
if(k == 3){
System.out.println("continue inner");
continue inner;
}
}
}
}
}
}
执行结果:
i =0
continue inner
i =1
continue inner
i =2
continue
i =3
break
i =4
continue inner
i =5
continue inner
i =6
continue inner
i =7
continue outer
i =8
break outer
注意:
(1)break、continue只能中断最内层的循环;在抵达for循环体末尾之前,递增表达式不会执行。break,continue会跳过递增表达式,故上面示例代码中都有单独自增一次的处理。
(2)在Java中需要使用标签的唯一理由就是因为有嵌套循环的存在,而且想从嵌套中break或者continue。
(3)在上篇博文中提及的Dijkstra《Goto有害》论文中,他其实最反对的是标签,而非goto,因为标签和goto的滥用,使得程序难以控制和理解。但是Java中的标签不会,因为他们的应用场合收到了限制(嵌套循环)。由此引出了一个有趣的现象,通过限制语句的能力,反而能使一项语言特性更加有用。