分享
 
 
 

标签的 break 和 continue 语句

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

带标签的 break 和 continue 语句

边城狂人 2002 年 12 月

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

/*

* @file LabelExample.java

* @author James Fan

*/

/**

* LabelExample 类将随机生成一个二维数组,

* 数组每一行中的数据都是从小到在的顺序排列,但各行间并没有排序。

* 同时,LabelExample 还会从生成的二维数组里随机找一个数作为要查找的数据。

* 随后在 search 方法中使用带标签的 break 和 continue 语句来优化查找代码。

*/

public class LabelExample {

int row; // 二维数组的行数

int col; // 二维数组每行的数据个数

int[][] data; // 数组数据

int lookfor; // 要在数组中查找的数

/**

* 构造函数,生成一个由 row 指定行数,由 col 指定列数的数组。

*/

public LabelExample(int row, int col) {

this.row = row;

this.col = col;

createMatrix();

}

/**

* 生成随机数组和随机抽取要查找的数。

*/

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)];

}

/**

* 打印数组内容。

*/

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("\t" + data[i][j]);

}

System.out.println();

}

}

/**

* 演示查找过程,使用带标签的 break 和 continue 语句。

*/

public void search() {

//loop1: // 若在此处定义标签,由于不是其后紧跟循环语句,所以会被勿略掉。

/* 被忽略掉的标签,如果在 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 ---");

}

/**

* 主程序。

*/

public static void main(String[] args) {

LabelExample test = new LabelExample(3, 5);

test.printMatrix();

System.out.println();

test.search();

}

}

这段程序的运行结果如下:

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 定义在哪里了,编译器会把它忽略掉的。

若需要转载请注明作者和出处

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有