带标签的break和continue(java基础)

转载 2013年12月02日 16:18:30

        Java 中有 goto 关键字,但这个关键字没有任何作用,换句话说,我们不能使用 goto 来进行跳转到某行。实际上,结构化程序设计完全不需要 goto 语句即可完成各种流程,而 goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。

        Java 中同样可以定义标签,使用标识符加冒号 (:) 的形式,如“mylabel:”。不过既然 Java 中的 goto 没有实质性的作用,标签的设计当然就不是为了 goto。

  Java 中的标签是为循环设计的,是为了在多重循环中方便的使用 break 和 coutinue 而设计的。正是由于这个原因,Java 的标签只能定义在三种循环 (for() {}, do{} while(), while() {}) 的开始位置,否则编译器会报告说找不到标签。稍后的例子即可更直观的说明。

       在循环前面加上标签,就好像给循环起了个名字。而后在循环中使用 break 或者 continue 语句的时候,就可以带上这个标签做为参数,指明跳出 (break) 或者继续 (continue) 哪一个循环,如“break mylabel;”、“continue mylabel;”。现在请看下面的例 1,直观的了解标签的用法,其中的注释已经大略说明了每分部代码在干什么,而示例后面的解释会让你更加明白:

例 1:LabelExmaple.java
  
  /**//*
   * @(#) LabelExample.java
   * @author James Fancy
   */
  
  /** *//**
   * LabelExample 类将随机生成一个二维数组,
   * 数组每一行中的数据都是从小到在的顺序排列,但各行间并没有排序。
   * 同时,LabelExample 还会从生成的二维数组里随机找一个数作为要查找的数据。
   * 随后在 search 方法中使用带标签的 break 和 continue 语句来优化查找代码。
   */
  public class LabelExample ...{
  
   /** *//**
   * 主程序。
   */
   public static void main(String[] args) ...{
   LabelExample test = new LabelExample(3, 5);
   test.printMatrix();
   System.out.println();
   test.search();
   }
  
   int row; // 二维数组的行数
  
   int col; // 二维数组每行的数据个数
  
   int[][] data; // 数组数据

  
   int lookfor; // 要在数组中查找的数
  
   /** *//**
   * 构造函数,生成一个由 row 指定行数,由 col 指定列数的数组。
   */
   public LabelExample(int row, int col) ...{
   this.row = row;
   this.col = col;
   createMatrix();
   }
  
   /** *//**
   * 打印数组内容。
   */
   public void printMatrix() ...{
   System.out.println("row = " + row + ", col = " + col + ", lookfor = "
   + lookfor);
   for (int i = 0; i < row; i++) ...{
   for (int j = 0; j < col; j++) ...{
   System.out.print(" " + data[i][j]);
   }
   System.out.println();
   }
   }
  
   /** *//**
   * 演示查找过程,使用带标签的 break 和 continue 语句。
   */
   public void search() ...{
   //loop1:
   // 若在此处定义标签,由于不是其后紧跟循环语句,所以会被勿略掉。
   // 被忽略掉的标签,如果在 break 或者 continue 语句中用到,编译时不能通过。
   // 如果没有在 break 或者 continue 中用到则编译可以成功。
   System.out.println("--- Begin Searching ---");
   loop1: for (int i = 0; i < row; i++) ...{
   for (int j = 0; j < col; j++) ...{
   if (data[i][j] > lookfor) ...{
   System.out.println("--- JUMP ---");
   continue loop1; // 想想此处用 break,结果会有什么变化
   }
   if (data[i][j] == lookfor) ...{
   System.out.println("FOUND: data[" + i + "][" + j + "] = "
   + lookfor);
   break loop1; // 想想此处用 return,结果会有什么变化
   }
   System.out
   .println("data[" + i + "][" + j + "] = " + data[i][j]);
   }
   System.out.println("--- LOOP2END ---");
   }
   System.out.println("--- End Searching ---");
   }
  
   /** *//**
   * 生成随机数组和随机抽取要查找的数。
   */
   private void createMatrix() ...{
   data = new int[row][];
   for (int i = 0; i < row; i++) ...{
   data[i] = new int[col];
   int t = 0;
   for (int j = 0; j < col; j++) ...{
   t += (int) (Math.random() * 20);
   data[i][j] = t;
   }
   }
   lookfor = data[(int) (Math.random() * row)][(int) (Math.random() * col)];
   }
  
  }
    这段程序的运行结果如下:
  
  row = 3, col = 5, lookfor = 48
   11 21 22 38 39
   14 22 40 55 72
   11 29 38 48 63
  
  --- Begin Searching ---
  data[0][0] = 11
  data[0][1] = 21
  data[0][2] = 22
  data[0][3] = 38
  data[0][4] = 39
  --- LOOP2END ---
  data[1][0] = 14
  data[1][1] = 22
  data[1][2] = 40
  --- JUMP ---
  data[2][0] = 11
  data[2][1] = 29
  data[2][2] = 38
  FOUND: data[2][3] = 48
  --- End Searching ---
  
    由于程序中所有数据都是随机生成的,所以,运行该程序多次才得到上述较具代表性的结果。
  
    上面程序中,createMatrix 方法和 printMatrix 方法都是工具,一个用于初始化数据,另一个则用于打印数组。而另一个方法 search 则是演示程序的关键之所在。
  
    search 方法中打印的数据足以说明查找的过程。第一个 for 循环 (即标签为 loop1 的那个) 用于遍历二维数组中的所有组 (即每一行);第二个 for 循环嵌套在第一个 for 循环中,用来遍历每一组中的所有数据,以便依次查找。
  
    如果第二个 for 循环对某组数据进行查找的过程中没有找到要查找的数据,则有两种情况:1) 该组的数据全都比要查找的数据小,那么这个循环能够被完整执行,则可以执行该循环之后的语句,即输出“--- LOOP2END ---”。2) 该组数据有比要查找的数据大的数据,那么在检查到第一个比要查找的数据大的数据时,执行了 continue loop1。此语句不仅跳出了第二个 for 循环,还中止了第一个 for 循环中尚未执行的语句,直接进行第一个 for 循环的下一次循环。这里有一个问题,如果把 continue loop1 改成 break 会怎么样呢?如果改了,输入结果就会是:
  
   ……
  --- JUMP ---
  --- LOOP2END ---
   ……
    造成这一现象的原因,是 braek 只中止了第二个循环,却没有中止第一个循环中尚未执行的语句。
  
    现在在来看看找到了目标数据时的情况。如果找到了目标数据,则无论再执行哪一个循环都毫无意义了。所以,要中止掉两个循环。由于是在第二个循环中找到数据的,而第二个循环嵌套在第一个循环当中,如果直接 break 的话,则只能中止第二个循环,第一个循环仍然会继续;而使用 break loop1 则指定了中止第一个循环,既然第一个循环都被中止了,那么依赖于第一个循环的第二个循环当然也就被中止了。这里也有一个问题,为什么不用 return 呢?我想这个问题比上一个问题更好答,因为如果使用 return,那么这两个 for 循环之后的语句怎么办?
  
    需要注意的是,这里的 continue 和 break 都用到了 loop1 标签。如果将代码中“System.out.println("--- Begin Searching ---");”和“loop1:”两条语句的位置交换一下,那么结果会怎么样呢?此时编译器会报告说找不到 loop1 标签。这就是上面提到的,标签定义之后必须紧接着循环语句的原因。不过,如果程序中没有任何一个 break 或者 continue 语句用到 loop1 的话,就无所谓 loop1 定义在哪里了,编译器会把它忽略掉的。
  
    最后,补充一句,一般情况下还是不要使用 label。如果遇到一些比较复杂的多重循环,我更愿意建议使用多个方法来执行每一层的循环,这样会让程序结构显得更加清楚一些
   文章转自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=229728&PostID=9990627

swift之控制转移语句,continue,break,fallthrough,return,带标签的语句

swift之控制转移语句,continue,break,fallthrough,return,带标签的语句
  • lvdezhou
  • lvdezhou
  • 2015年11月16日 11:09
  • 1045

break、continue关键字配合标签使用,实现跳转功能

知识点:continue和break配合标签实现跳转功能       尽管java中goto是一个保留字,但在语言中并未使用它,Java没有goto。然后java也可以完成一些类似于跳转的操作,...
  • yybj
  • yybj
  • 2014年10月14日 02:04
  • 2174

再探java基础——break和continue的用法

再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中。 用于switch...case中: 执行完满足case条件的...
  • luoweifu
  • luoweifu
  • 2013年08月31日 19:09
  • 34094

C++和Java break语句和continue语句带标号和不带标号的比较

今天在复习Java的时候,发现一个Java的break语句和continue语句和C++/C语言里面的有点不同。 首先来介绍一下break和continue语句: break 和continue 语句...
  • Xiao_xuer
  • Xiao_xuer
  • 2017年12月15日 20:47
  • 183

java关键字之break与continue的区别(简单明了的小例子)

一.作用与区别 break的作用是跳出当前循环块(for、while、do while)或程序块(switch)。在循环块中的作用是跳出当前正在循环的循环体。在程序块中的作用是中断和下一个case条...
  • tomcat_2014
  • tomcat_2014
  • 2015年10月19日 19:48
  • 1234

JAVA学习笔记5——for循环+循环训练题+break、continue+方法概述+递归调用

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。 回家的前两天正值周末,所以····嘿嘿懂得~ 今天继续写第5篇,从这篇...
  • u014440351
  • u014440351
  • 2015年01月19日 10:57
  • 1362

Java中带标签的break、continue

package breakcontinue; import java.awt.Label; import javax.security.auth.kerberos.KerberosKey; pu...
  • wwww4
  • wwww4
  • 2015年06月01日 21:06
  • 585

JAVA基础---break语句和continue语句

最近在温习java基础,对break和continue又重新认识一下。仅此记录一下供以后查阅。 java中break语句和continue语句是和循环语句紧密相关的两种语句。 其中break关键字...
  • u010680097
  • u010680097
  • 2016年07月27日 15:56
  • 2028

Java中带标签的break的用法

在研究Android下断点上传文件时,遇到了一个java有意思的写法,break + 标签 积累下。 package com.zhcv.example.socket.util; import ja...
  • mlj1668956679
  • mlj1668956679
  • 2013年12月23日 16:39
  • 1720

带标签的break和continue语句

尽管无标签的break和continue语句非常常见,但使用标签的语句可以使程序更加紧凑,当然毫无疑问降低了程序的可读性。简单文绉绉地说下无标签的两者是如何工作的:break是退出最内层的循环结构,并...
  • u013779489
  • u013779489
  • 2014年03月06日 19:34
  • 568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:带标签的break和continue(java基础)
举报原因:
原因补充:

(最多只允许输入30个字)