Java标签-break-continue

来源:互联网 发布:游戏养羊软件 编辑:程序博客网 时间:2024/05/27 10:44

很多程序设计语言中有goto语句,goto语句的使用,使的程序变得难以读懂,尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在breakcontinue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使用了相同的机制:标签。

下面是一个例子,介绍一下这种标签在java中的使用。

public static void testBreakLabel(){System.out.println("测试break+标签:");int i = 0;mylabel1: for (int k = 0; k < 5; k++){i++;if (k == 2){// 此时i=3break mylabel1;// 此时不加标签,也是这结果}System.out.println("i:" + i + ", k:" + k);}/* * 测试break+标签: i:1, k:0 i:2, k:1 */}
这说明当k=2时,执行了break语句,跳转到了mylabel1标签处,但是并没有再进入这个for语句块


public static void testContinueLabel(){System.out.println("测试continue+标签:");int i = 0;mylabel2: for (int k = 0; k < 5; k++){i++;if (k == 2){// 此时i=3continue mylabel2;// 此时不加标签,也是这结果}System.out.println("i:" + i + ", k:" + k);}/* * 测试continue+标签: i:1, k:0 i:2, k:1 i:4, k:3 i:5, k:4 */}

这说明当k=m时,执行了break语句,跳转到了label3标签处,但是并没有在进入这个for语句块。
上面这两种情况的结果与不使用标签的,只使用break和continue的情况是相同的。因而体现不出标签的作用。


public static void testLabelFunctionBreak(){System.out.println("测试Label真正作用:利用break label退出二层循环");int h = 0;myLabel3: for (int k = 0; k < 5; k++){System.out.println("myLabel3 第一层:");for (int m = 0; m < 5; m++){System.out.print("  myLabel3 第二层,");h++;if (m == 2){break myLabel3;}System.out.println("k:"+k+", h:"+h+", m:"+m);}}/*测试Label真正作用:退出二层循环myLabel3 第一层:  myLabel3 第二层,k:0, h:1, m:0  myLabel3 第二层,k:0, h:2, m:1  myLabel3 第二层,*/}

这说明当k=m时,执行了break语句,跳转到了mylabel3标签处,但是并没有在进入这个for语句块。


public static void testLabelFunctionContinue(){System.out.print("\n\n测试Label真正作用:continue双循环");int h = 0;myLabel4: for (int k = 0; k < 5; k++){System.out.print("\nmyLabel4 第一层:");for (int m = 0; m < 5; m++){System.out.print("\n  myLabel4 第二层,");h++;if (m == 2){//作用后,由于myLabel4在外层循环,//所以从外层循环开始:直接k++,m从2又重新初始化0continue myLabel4;}System.out.print("k:"+k+", h:"+h+", m:"+m);}}/*测试Label真正作用:continue双循环myLabel4 第一层:  myLabel4 第二层,k:0, h:1, m:0  myLabel4 第二层,k:0, h:2, m:1  myLabel4 第二层,//从外层循环开始,所以下面的结果顺利成章,不用记规则什么的myLabel4 第一层:  myLabel4 第二层,k:1, h:4, m:0  myLabel4 第二层,k:1, h:5, m:1  myLabel4 第二层,myLabel4 第一层:  myLabel4 第二层,k:2, h:7, m:0  myLabel4 第二层,k:2, h:8, m:1  myLabel4 第二层,myLabel4 第一层:  myLabel4 第二层,k:3, h:10, m:0  myLabel4 第二层,k:3, h:11, m:1  myLabel4 第二层,myLabel4 第一层:  myLabel4 第二层,k:4, h:13, m:0  myLabel4 第二层,k:4, h:14, m:1  myLabel4 第二层,*/}
这说明当m=2时,执行了continue语句,跳出了循环没有执行println语句,然后从mylabel4标签的地方再次进入for语句块。当有多重循环的时候,程序只想跳出内层循环,而不跳出外层循环的时候就可以使用这样的break和continue标签了。这种嵌套循环也是适合while语句。

当然你也可以写出这样的代码

public static void  testLabeltoSkip(){mylabel5:{int sikpNum=5;if(sikpNum==5){//此处执行可以跳过下面的内容,相当于省略elseSystem.out.println("\n\nif内容执行,跳过下面内容");break mylabel5;}System.out.println("else的内容");}    /*     if内容执行,跳过下面内容     */}
用以跳过下面省略了的代码,当然这样的写法完全可以使用if else代替。
下面是对这个用法的总结:
(1) 简单的一个continue会退回最内层循环的开头(顶部),并继续执行。
(2) 带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环
(3) break会中断当前循环,并移离当前标签的末尾。
(4) 带标签的break会中断当前循环,并移离由那个标签指示的循环的末尾。


1 0
原创粉丝点击