臭名昭著的“goto”

旧时模样 提交于 2020-01-08 06:02:05

尽管goto仍是Java中的一个保留字,但在语言中并未使用它,Java没有goto。但是Java能通过break、continue关键字和便签机制实现类似于跳转的功能。

标签是后面跟有冒号的标识符,例如:‘lable1:’。

在Java中,标签起作用的唯一的地方刚好是在迭代语句之前,“刚好之前”的意思表明,在标签和迭代之间置入任何语句都不好。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键字通常只中断当前循环,但若随同标签一起使用,他们就会中断循环,知道标签所在的地方:

label1://Can't have statements here
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处,但并不重新进入迭代,也就是说,它实际是完全终止了两个迭代。

例子:

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 < 2; k++) {
							if(k == 1) {
								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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!