4.4 控制循环结构 4.4.1 使用break结束循环 4.4.2 使用continue忽略本次循环剩下语句 4.4.3 使用return结束方法

4.4 控制循环结构

Java语言没有提供goto语句来控制程序的跳转,这种做法提高了程序流程控制的可读性,但降低了程序流程控制的灵活性。为了弥补这种不足,Jaⅵa提供了continuebreak来控制循环结构。除此之外,retur可以结束整个方法,当然也就结束了一次循环。

4.4.1 使用break结束循环

某些时候需要在某种条件岀现时强行终止循环,而不是等到循环条件为false时才退出循环。此时,可以使用break来完成这个功能。**break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束该循环,开始执行循环之后的代码**。
例如如下程序

1
2
3
4
5
6
7
8
9
10
11
12
public class BreakTest {
public static void main(String[] args) {
// 一个简单的for循环
for (int i = 0; i < 10; i++) {
System.out.println("i的值是" + i);
if (i == 2) {
// 执行该语句时将结束循环
break;
}
}
}
}

运行上面程序,当i等于2时,循环体内遇到break语句,程序跳出该循环。

break外层循环

break语句不仅可以结束其所在的循环,还可以直接结束其外层循环。此时需要在break后紧跟个标签,这个标签用于标识一个外层循环。

标签

Java中的标签就是一个紧跟着英文冒号(:)的标识符:

1
标签:

与其他语言不同的是,Java中的标签只有放在循环语句之前才有作用
例如下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BreakTest2 {
public static void main(String[] args) {
// 外层循环,outer作为标识符
outer:
for (int i = 0; i < 5; i++) {
// 内层循环
for (int j = 0; j < 3; j++) {
System.out.println("i的值为:" + i + " j的值为:" + j);
if (j == 1) {
// 跳出outer标签所标识的循环。
break outer;
}
}
}
}
}

运行上面程序,看到如下运行结果:

1
2
i的值为:0  j的值为:0
i的值为:0 j的值为:1

程序从外层循环进入内层循环后,当j等于1时,程序遇到一个break outer;语句,这行代码将会结束outer标签指定的循环,也就是结束外层循环。所以看到上面的运行结果。

标签应该放在break所在的循环的外层循环定义

值得指出的是,break后的标签必须是一个有效的标签,即这个标签必须在break语句所在的循环之前定义,或者在其所在循环的外层循环之前定义。
如果把这个标签放在break语句所在的循环之前定义,也就失去了标签的意义,因为break默认就是结束其所在的循环。

紧跟break之后的标签,必须在break所在循环的外层循环之前定义才有意义

4.4.2 使用continue忽略本次循环剩下语句

continue的功能和break有点类似,区别是**continue只是忽略本次循环剩下语句,接着开始下一次循环,并不会终止循环**;而break则是完全终止循环本身。

如下程序示范了continue的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ContinueTest {
public static void main(String[] args) {
// 一个简单的for循环
for (int i = 0; i < 3; i++) {
System.out.println("i的值是" + i);
if (i == 1) {
// 忽略本次循环的剩下语句
continue;
}
System.out.println("continue后的输出语句");
}
}
}

运行上面程序,看到如下运行结果:

1
2
3
4
5
i的值是0
continue后的输出语句
i的值是1
i的值是2
continue后的输出语句

从上面运行结果来看,当i等于1时,程序没有输出“continue后的输出语句”字符串,因为程序执行到continue时,忽略了当次循环中continue语句后的代码。
从这个意义上来看,如果把一个continue语句放在单次循环的最后一行,这个continue语句是没有任何意义的,因为它仅仅忽略了一片空白,没有忽略任何程序语句。

continue后接标签

break类似的是,continue后也可以紧跟一个标签,用于直接跳过标签所标识循环的当次循环的剩下语句,重新开始下一次循环。
例如下面代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ContinueTest2 {
public static void main(String[] args) {
// 外层循环
outer:
for (int i = 0; i < 5; i++) {
// 内层循环
for (int j = 0; j < 3; j++) {
System.out.println("i的值为:" + i + " j的值为:" + j);
if (j == 1) {
// 忽略outer标签所指定的循环中本次循环所剩下语句。
continue outer;
}
}
}
}
}

运行上面程序可以看到,循环变量j的值将无法超过1,因为每当j等于1时,continue outer;语句就结束了外层循环的当次循环,直接开始下一次循环,内层循环没有机会执行完成。
break类似的是,continue后的标签也必须是一个有效标签,即这个标签通常应该放在continue所在循环的外层循环之前定义。

4.4.3 使用return结束方法

return关键字并不是专门用于结束循环的,return的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
Java程序中大部分循环都被放在方法中执行,例如前面介绍的所有循环示范程序。一旦在循环体内执行到一个return语句,return语句就会结束该方法,循环自然也随之结束。例如下面程序。

1
2
3
4
5
6
7
8
9
10
11
12
public class ReturnTest {
public static void main(String[] args) {
// 一个简单的for循环
for (int i = 0; i < 3; i++) {
System.out.println("i的值是" + i);
if (i == 1) {
return;
}
System.out.println("return后的输出语句");
}
}
}

运行上面程序,循环只能执行到i等于1时,当i等于1时程序将完全结束(当main方法结束时,也就是Java程序结束时)。从这个运行结果来看,虽然return并不是专门用于循环结构控制的关键字,但通过return语句确实可以结束一个循环。与continuebreak不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。