java的goto语句—— 标签的使用

      编程语言中一开始就有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;

      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;

 @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;

猜你喜欢

转载自xiaochuang.iteye.com/blog/2285198