Java标签-break-continue

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 11:48   14   0

很多程序设计语言中有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=3
    break 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=3
    continue 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又重新初始化0
     continue 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)
   {
    //此处执行可以跳过下面的内容,相当于省略else
    System.out.println("\n\nif内容执行,跳过下面内容");
    break mylabel5;
   }
   
   System.out.println("else的内容");
  }
     /*
      if内容执行,跳过下面内容
      */
 }
用以跳过下面省略了的代码,当然这样的写法完全可以使用if else代替。
下面是对这个用法的总结:
(1) 简单的一个continue会退回最内层循环的开头(顶部),并继续执行。
(2) 带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环
(3) break会中断当前循环,并移离当前标签的末尾。
(4) 带标签的break会中断当前循环,并移离由那个标签指示的循环的末尾。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP