Java 中break和continue结合标签标示符中断循环示例详解(附源码)

臭名昭著的goto

编程语言中一开始就有goto关键词了。事实上,goto起源于汇编语言的程序控制:“若条件A成立,则跳到这里;否则跳到那里”。如果阅读由编译器最终生成的汇编代码,就会发现程序控制里包含了许多跳转。(Java编译器生成它自己的“汇编代码”,但是这个代码是运行在Java虚拟机上的,而不是直接运行在CPU硬件上。)

goto语句是在源码级上的跳转,这使其招致了不好的声誉。若一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程呢?自从Edsger Dijkstra发表了著名论文《Goto considered harmful》Goto有害),众人开始痛斥goto的不是,甚至建议将它从关键字集合中扫地出门。

对于这个问题,中庸之道是最好解决方法。真正的问题并不在于使用goto,而在于goto的滥用;而且少数情况下,goto还是组织控制流程的最佳手段。

标签是什么

尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而,Java也能完成一些类似于跳转的操作,这与breakcontinue这两个关键词有关。它们其实不是一个跳转,而是中断迭代语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使用了相同的机制:标签。

标签是后面跟有冒号的标示符,就像下面这样:

label1:

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

label1:
		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处,但并不重新进入迭代。也就是说,它实际是完全中止了两个迭代。

示例源码

下面是标签用于for循环和while循环的例子:

package com.mufeng.thefourthchapter;

public class Labeled {
	public static void main(String[] args) {
		System.out.println("标签用于for循环的例子");
		int i = 0;
		outer: // Can't have statements here 这里不能有陈述
		for (; true;) {// infinite loop 无限循环
			inner: // Can't have statements here 这里不能有陈述
			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++;// Otherwise i never gets incremented 否则i不会得到增量
					break;
				}

				if (i == 7) {
					System.out.println("continue outer");
					i++;// Otherwise i never gets incremented 否则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("标签用于while循环的例子");

		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("continue");
					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;
				}
			}
		}

	}

}

输出结果

标签用于for循环的例子
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循环的例子
Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer

源码解析

注意,break会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。由于break跳过了递增表达式,所以在i==3的情况下直接对i执行递增运算。在i==7的情况下,continue outer语句会跳到循环顶部,而且也会跳过递增,所以这里也对i直接递增。

如果没有break outer语句,就没办法从内部循环里跳出外部循环。这是由于break本身只能中断最内层的循环(continue同样也是如此)。

当然,如果想在中断循环的同时退出,简单地用一个return即可。

同样的规则亦适用于while

  • 一般的continue会退回最内层循环的开头(顶部),并继续执行。
  • 带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
  • 一般的break会中断并跳出当前循环。
  • 带标签的break会中断并跳出标签所指的循环。

要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中breakcontinue

时间: 2024-12-15 17:47:55

Java 中break和continue结合标签标示符中断循环示例详解(附源码)的相关文章

java中break、continue及标签等跳转语句的使用[上]

java 中跳转语句使用break.continue和标签,各自或组合完成相应的功能. 今天做题时遇到关于标签命名规范,顺便将跳转语句语法都看了一遍,很有收获. 在<Java编程思想>一书中,作者详细阐述,现将案例代码写在下面: public class LabeledFor { public static void main(String[] args) { int i=0; outer: for(;true;){ inner: for(;i<10;i++){ System.out.p

java中break和continue跳出指定循环(转载)

java中break和continue跳出指定循环 java中break和continue可以跳出指定循环,break和continue之后不加任何循环名则默认跳出其所在的循环,在其后加指定循环名,则可以跳出该指定循环(指定循环一般为循环嵌套的外循环). break跳出指定循环示例代码: loop1:for(int x = 0; x < 4; x++) { loop2:for (int y = 0; y < 5 ; y++ ) { System.out.println("x=&quo

Java中break和continue跳出指定循环

在Java中,break和continue可以跳出指定循环,在循环前指定一个标签名称,使用break跳出即可.continue同. 代码如下: (1) 简单的一个continue会退回最内层循环的开头(顶部),并继续执行.        (2) 带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环 (3) break会中断当前循环,并移离当前标签的末尾. (4) 带标签的break会中断当前循环,并移离由那个标签指示的循环的末尾. 扩展: Java中,goto语句作为保

java中break和continue的区别详解(附源码)

序言 在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue控制循环的流程.其中,break用于强行退出循环,不执行循环中剩余的语句.而continue则停止执行当前迭代,然后退回循环起始处,开始下一次迭代. 源码 下面这个程序向大家展示了break和continue在for和while循环中的例子: package com.mufeng.thefou

Java 中 break和 continue 的使用方法及区别

break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后结束switch,不执行下面的语句. eg: public static void breakSwitch1() {           int n = 1;           switch (n) {           case 1:               System.out.println("this is one.");  

JAVA中break,continue语句的用法

1.break语句不带标签: public class TestBreak1 { public static void main(String[] args){ int score,sum=0,i; for(i=0;i<=10;i++){ score=(int)(Math.random()*100); System.out.print(score+","); if(score<60)break; //无标签格式 sum+=score; } System.out.printl

JAVA中Break与Continue

在使用循环语句的时候,只有当循环条件的表达式为假时,才会跳出循环.有时候我们想提前跳出循环,那么就需要在循环内部使用break或者continue. break可以终止循环和switch语句.一个无标号的break会把控制转移到当前(最内)循环(while,do....while,for或switch)的下一条,如果有标号,会转移到带有该标号的语句处.例如: 1 package com.review.chapter2; 2 3 public class TestBreak { 4 public

Java中包含继承关系时对象的创建与销毁顺序详解(附源码)

前言 通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行处理.如果确实遇到清理的问题,那么必须用心为新类创建dispose()方法(在这里我选用此名称,读者可以提出更好的).并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose()方法.当覆盖被继承类的dispose()方法时,务必记住调用基类版本dispose()方法:否则,基类的清理动作就不会发生.下例就证明了这一点: 示例源码 package com

Cocos2dx-3.x 中CCCamera相机类详解及源码分析

Cocos2d-x 3.3版本中加入了相机这个类,该类在3D游戏中是必不可少的,在3D立体游戏中,往往需要视野角度的变化,通过相机的变换才能观察和体验整个游戏世界. CCCamera类基本使用 在游戏中一般有两种类型的相机:一种是透视相机,它在3D游戏中十分常见:另一种是正交相机,它没有透视相机的近大远小的效果而是相机内任何位置的物体大小比例都是一样的. 上图是透视相机的原理图,一般来说,我们通过以下代码创建: _camera = Camera::createPerspective(60, (G