编程语言中一开始就有goto关键词了。事实上,goto起源于汇编语言的程序控制:“若条件A成立,则跳到这里;否则跳到那里”。
goto语句是在源码级上的跳转,这使其招致了不好的声誉。若一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程呢?
其实真正的问题并不在于使用goto语句,而在于goto的滥用;而且在少数情况下,goto还是组织控制流程的最佳手段。结束
尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而,Java也能完成一些类似于跳转的操作,这与break和continue这两个关键词有关。它们其实不是一个跳转,而是中断迭代语句的一种方法。之所以把它们纳入goto问题中讨论,是因为它们使用相同的机制:标签。
标签是后面跟有冒号的标示符,就想下面这样:
lable1:
在java中,标签起作用的唯一地方刚好是在迭代语句之前。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若是随同标签一起使用,他们就会中断循环,知道标签所在的地方:
下面是标签在for循环中的示例:
@Test
public void TestLable(){
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;
}
}
}
}
System.out.println("结束");
}
结果:
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
结束
结束
同样的规则亦适用于while:
1)、一般的continue会退回内层循环的开头,并继续执行。
2)、带标签的continue会到达标签的位置,并重新进入紧接在哪个标签后面的循环。
3)、一般的break会中断并跳出当前循环。
4)、带标签的break会中断并跳出标签所指的循环。
重点:在Java中需要使用标签的唯一理由就是因为有循环嵌套的存在,而且想从多层嵌套中break或者continue;