尽管goto仍是Java的一个保留字,但并未在语言中得到正式的使用;Java没有goto。
然而,在break和continue这两个关键字的身上,我们仍然看出一些goto的影子。他并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入goto问题一起讨论,是由于它们使用了相同的机制:标签(label)。
在Java中,标签起作用的唯一的地方是在迭代语句之前。在标签和迭代之间置入任何语句都是不明智的。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于break和continue关键字通常只终端当前循环,但若随同标签使用,它们就会中断所有进行中的循环,转到标签所在的地方。
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
下面这个例子展示了带标签的break以及continue语句在while循环中的用法
public static void main(String[] args) {
int i = 0;
outer:
while(true){
System.out.println("Outer while loop");
while(true){
i++;
System.out.println("i = " + i);
if(i == 1){
System.out.println("continu");
continue;
}
if(i == 3){
System.out.println("continue outer");
continue outer;
}
if(i == 5 ){
System.out.println("break");
break;
}
if(i == 7){
System.out.println("break outer");
break outer;
}
}
}
}
运行结果:
Outer while loop
i = 1
continu
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer
同样的规则适用于while:
1)一般的continue会退回最内层循环的开头(顶部),并继续执行。
2)带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
3)一般的break会终端并跳出当前的循环。
4)带标签的break会中断并跳出标签所指的循环。
要记住的重点是:在Java里需要使用标签的唯一理由是有循环嵌套,而且你想从不止一个嵌套中break或continue。