Java中的break和continue(非常详细)
break和continue是 Java 语言中提供的跳转语句,可以控制程序从一个地方直接跳转到另外一个地方继续执行,在循环体比较复杂的情况下经常会被用到。
break 语句可以出现在循环体中,其作用是使程序立即退出循环,转而执行该循环外的语句。如果 break 语句出现在嵌套循环的内层循环中,则只会终止当前内层循环,外层循环则不受影响。
break 语句在 3 种循环语句中都可以使用,书写在其重复执行语句块中,一般配合 if 语句进行使用,执行流程如下图所示:

图 1 break控制循环流程图
【实例】用 while 循环语句来循环输入并打印学生成绩,如果输入成绩为 -1 则退出循环。
第 9 行书写了一个 if 条件语句:
break 语句不仅可以在 while 循环中使用,也可以在 do-while、for 循环中使用,方式相同,都是书写在循环体中,碰到 break 则循环终止。
标签的命名需要遵循标识符的命名规则,标签名后书写一个冒号,冒号后为标签中要执行的代码块,该代码块中可以使用“break 标签名”来退出该代码块,具体语法如下:
第 4 行声明了一个变量 i,初始值为 1,作为终止代码块的条件。第 6 行是一个判断条件,i 的初始值为 1,因此 1 == 1 这个条件成立,执行 if 后的 break 语句,break 后跟的是刚才的标签名,表示跳出以 labelName 命名的代码块,此时第 9 行的语句将不再执行,直接跳转到 labelName 标签对应的代码块后继续执行,也就是执行第 11 行语句。
程序中使用{}将一句或多句代码括起来即可组成一个代码块,这个代码块并不一定是在分支后或者循环后,可以独立存在。
在此需要注意的是,标签定义的代码块中有可能仍然有标签定义,即代码块是可以进行嵌套的,此时如果 break 在外层标签的代码块中,那么其后的标签名只能书写外层的标签名,如果 break 在内层中则可以书写内层标签名也可书写外层的标签名,即 break 后的标签名只要是包住自己的标签即可。具体语法如下:
此处语法仅仅是两层嵌套,实际可以是很多层,含义与此一样,只要是包住该 break 语句的标签名都可以使用。即 break 配合标签使用,可以用来终止一个或任意多个代码块。利用 break 配合标签使用,可以用来直接终止多层循环的运行。
接下来,编写一个 3 层嵌套 for 循环,循环变量分别为 x、y、z,如果 x + y + z = 10,则直接终止所有循环。
第 5 行 labelY 是第 2 层循环的标签。第 6 行 labelZ 是第 3 层循环的标签。
第 7 行是一个判断条件,如果 x + y + z 的结果为 10 则执行第 8 行代码。该程序执行过程中,此时 x = 1,进入第 1 层循环体,第 1 层的循环体是第 2 层循环;此时 y = 1,进入第 2 层循环的循环体,第 2 层的循环体是第 3 层循环;当第 3 层循环到 z = 8 时,判断条件成立,此时 x = 1、y = 1、z = 8,执行第 8 行语句,直接退出 labelX 对应的循环,即第 1 层循环。
因此,此时 z++、y++、x++ 都不会执行,将直接退出 3 层循环,转而开始执行第 13 行代码。
和 break 语句不同的是,continue 在循环体中直接使用,用来结束本次循环直接进入下一次循环,配合标签使用则用来实现类似 C语言 goto 语句的效果,实现向前跳转。同时,需要注意 continue 只能用在循环体中。
continue 语句可以出现在 while 循环、do-while 循环以及 for 循环的循环体中,一般配合 if 语句进行使用,执行流程如下图所示:

图 2 continue控制循环流程图
从图 2 可以看出,程序碰到 continue 语句时,之后的语句组 2 将不再执行,直接回到循环条件处进行判断,根据判断结果来决定是否进入下一次循环。
continue 语句类似 break 语句,两者的区别在于:continue 并不是中断整个循环,而是终止当前这一次,进入下一次循环,并且 continue 只能出现在循环体中;break 语句出现在循环体中是终止整个循环,也可以出现在 switch 语句中。
接下来,根据 continue 的特性,编写一个案例:循环遍历 1~10 之间的偶数,4 不要打印出来。
第 8 行同样是一个判断条件,如果 i 的值为 4,则执行 continue 语句,即第 11 行不执行,直接执行 i++,然后进行循环条件判断,如果成立则进入下一次循环,否则退出循环。如果 i 是偶数,并且 i 不等于 4,将执行第 11 行,即将其输出。
continue 语句不仅可以在 for 循环中使用,也可以在 do-while、while 循环中使用,方式相同,都是书写在循环体中,碰到 continue 语句将终止本次循环,进入下一次循环。
与 break 类似,continue 所处的循环也可以是嵌套的,continue 后所书写的标签名可以是当前循环的标签名,也可以是外层循环的标签名。
continue 语句可以出现在 while、do-while 以及 for 循环中用来控制语句的跳转,在此以 for 循环为例进行语法的说明,具体语法如下:
接下来,利用 continue 配合标签使用实现九九乘法表。
内层循环条件是 j <= 10,即从内层循环来看它应该循环 10 次。第 7 行是一个判断,如果 j 和 i 的值相等,则执行第 8 行和第 9 行语句。第 9 行意味着继续 a 标签对应的循环,即外层循环,执行该语句将结束内层循环,直接进行外层循环的 i++,然后进行外层循环的循环条件判断,如果条件成立则进入外层循环的下一次循环。
从结果很明显可以看出,内层循环并没有执行 10 次,而是到达 i == j 时就终止了,进入了外层循环的下一次循环。
Java break语句
在分支语句的学习中,大家已经接触过 break 语句,可以用它来结束 switch 分支语句的继续执行。除此之外,break 还有两种用法,一种是在循环体中强制退出循环,另一种是配合标签使用实现类似 C语言 goto 语句的效果。1) 使用break强制退出循环
在程序中,有时需要强行终止循环,而不是等到循环条件为 false 时才退出循环。此时,可以使用 break 语句来实现这种功能。break 语句可以出现在循环体中,其作用是使程序立即退出循环,转而执行该循环外的语句。如果 break 语句出现在嵌套循环的内层循环中,则只会终止当前内层循环,外层循环则不受影响。
break 语句在 3 种循环语句中都可以使用,书写在其重复执行语句块中,一般配合 if 语句进行使用,执行流程如下图所示:

图 1 break控制循环流程图
【实例】用 while 循环语句来循环输入并打印学生成绩,如果输入成绩为 -1 则退出循环。
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (true) { System.out.println("-------输入学生成绩-------"); double score = scanner.nextDouble(); if (score < 0) { break; } System.out.println("学生成绩为:" + score); } System.out.println("循环终止!"); } }程序的运行结果如下:
-------输入学生成绩------
90
学生成绩为:90.0
-------输入学生成绩------
-1
循环终止!
第 9 行书写了一个 if 条件语句:
- 当第 1 次输入成绩为 90 时,该条件语句的判断条件不成立,if 语句中的语句将不会执行,继续执行第 13 行语句输出该学生的成绩,输出成绩后再次进行循环条件的判断,因为没有循环变量更替,所以该条件的结果恒为 true,再次录入学生成绩。
- 第 2 次输入成绩为 -1,第 9 行中 if 条件语句的判断条件 score < 0 成立,此时执行了第 10 行的 break 语句,循环终止,然后执行了 while 循环之外的第 14 行语句。
break 语句不仅可以在 while 循环中使用,也可以在 do-while、for 循环中使用,方式相同,都是书写在循环体中,碰到 break 则循环终止。
2) break语句配合标签
break 语句并不局限于终止一个循环语句或者退出 switch 分支语句,它还可以配合标签使用,用来终止一个或任意多个代码块,通过它可以实现代码跳转到指定位置继续执行。标签的命名需要遵循标识符的命名规则,标签名后书写一个冒号,冒号后为标签中要执行的代码块,该代码块中可以使用“break 标签名”来退出该代码块,具体语法如下:
标签名1: { 代码块1中的语句… if (跳转条件) { // 一般需要配合if使用,否则break后不可以书写代码 break 标签名1; // 执行到break语句时,将结束该代码块,执行代码块后的代码 } 代码块中1的语句… } 代码块后的代码…接下来,编写一个简单的案例来演示 break 配合标签使用的语法。
public class Demo { public static void main(String[] args) { labelName: { int i = 1; System.out.println("代码块语句1"); if (i == 1) { // 此为跳转条件,一般break都配合if使用 break labelName; } System.out.println("代码块语句2"); } System.out.println("代码块后的代码"); } }程序的运行结果如下:
代码块语句1
代码块后的代码
{ }
中的代码块起了一个名字。第 4 行声明了一个变量 i,初始值为 1,作为终止代码块的条件。第 6 行是一个判断条件,i 的初始值为 1,因此 1 == 1 这个条件成立,执行 if 后的 break 语句,break 后跟的是刚才的标签名,表示跳出以 labelName 命名的代码块,此时第 9 行的语句将不再执行,直接跳转到 labelName 标签对应的代码块后继续执行,也就是执行第 11 行语句。
程序中使用{}将一句或多句代码括起来即可组成一个代码块,这个代码块并不一定是在分支后或者循环后,可以独立存在。
在此需要注意的是,标签定义的代码块中有可能仍然有标签定义,即代码块是可以进行嵌套的,此时如果 break 在外层标签的代码块中,那么其后的标签名只能书写外层的标签名,如果 break 在内层中则可以书写内层标签名也可书写外层的标签名,即 break 后的标签名只要是包住自己的标签即可。具体语法如下:
标签名1: { 代码块1中的语句… if (跳转条件) { // 一般需要配合if使用,否则break后不可以书写代码 break 标签名1; // 执行到break语句时,将结束该代码块,执行代码块后的代码 } 标签名2: { 代码块2中的语句1 if (跳转条件) { break 标签名1/标签名2; } 代码块2中的语句2 } 代码块中1的语句… } 代码块后的代码…在标签 2 中包含的 break 语句,如果跟的是标签名 2 则终止标签名 2 对应的代码块,继续执行代码块 1 中的后续代码,如果跟的是标签名 1 则直接退出标签名 1 对应的代码块,继续执行代码块后的代码。
此处语法仅仅是两层嵌套,实际可以是很多层,含义与此一样,只要是包住该 break 语句的标签名都可以使用。即 break 配合标签使用,可以用来终止一个或任意多个代码块。利用 break 配合标签使用,可以用来直接终止多层循环的运行。
接下来,编写一个 3 层嵌套 for 循环,循环变量分别为 x、y、z,如果 x + y + z = 10,则直接终止所有循环。
public class Demo { public static void main(String[] args) { int x = 1, y = 1, z = 1; labelX: for (x = 1; x < 100; x++) { labelY: for (y = 1; y < 100; y++) { labelZ: for (z = 1; z < 100; z++) { if (x + y + z == 10) { break labelX; } } } } System.out.println("退出循环时x为:" + x); System.out.println("退出循环时y为:" + y); System.out.println("退出循环时z为:" + z); } }程序的运行结果如下:
退出循环时x为:1
退出循环时y为:1
退出循环时z为:8
{ }
括起来的代码块,但是该代码是一个 for 循环,是一个整体,除此之外没有其他代码,因此可以省略{ }
。第 5 行 labelY 是第 2 层循环的标签。第 6 行 labelZ 是第 3 层循环的标签。
第 7 行是一个判断条件,如果 x + y + z 的结果为 10 则执行第 8 行代码。该程序执行过程中,此时 x = 1,进入第 1 层循环体,第 1 层的循环体是第 2 层循环;此时 y = 1,进入第 2 层循环的循环体,第 2 层的循环体是第 3 层循环;当第 3 层循环到 z = 8 时,判断条件成立,此时 x = 1、y = 1、z = 8,执行第 8 行语句,直接退出 labelX 对应的循环,即第 1 层循环。
因此,此时 z++、y++、x++ 都不会执行,将直接退出 3 层循环,转而开始执行第 13 行代码。
Java continue语句
continue 语句与 break 语句类似,都有两种用法,可以在循环体中直接使用,也可以配合标签使用。和 break 语句不同的是,continue 在循环体中直接使用,用来结束本次循环直接进入下一次循环,配合标签使用则用来实现类似 C语言 goto 语句的效果,实现向前跳转。同时,需要注意 continue 只能用在循环体中。
1) 使用continue退出当前循环
continue 语句在循环体中直接使用可跳出本次循环体,本次循环体中剩余的语句将不再执行,直接进入下一次循环。换句话说,continue 语句可以结束本次循环,跳到循环条件处判断是否进入下一次循环。continue 语句可以出现在 while 循环、do-while 循环以及 for 循环的循环体中,一般配合 if 语句进行使用,执行流程如下图所示:

图 2 continue控制循环流程图
从图 2 可以看出,程序碰到 continue 语句时,之后的语句组 2 将不再执行,直接回到循环条件处进行判断,根据判断结果来决定是否进入下一次循环。
continue 语句类似 break 语句,两者的区别在于:continue 并不是中断整个循环,而是终止当前这一次,进入下一次循环,并且 continue 只能出现在循环体中;break 语句出现在循环体中是终止整个循环,也可以出现在 switch 语句中。
接下来,根据 continue 的特性,编写一个案例:循环遍历 1~10 之间的偶数,4 不要打印出来。
public class Demo { public static void main(String[] args) { System.out.println("-------循环遍历1~10的偶数,4不要打印出来------"); for (int i = 1; i <= 10; i++) { if (i % 2 != 0) { continue; } if (i == 4) { continue; } System.out.print(i + "\t"); } } }程序的运行结果如下:
-------循环遍历1~10的偶数,4不要打印出来------ 2 6 8 10程序中,第 5 行是一个判断条件,如果 i 不是偶数,将执行 continue 语句,即终止本次循环,继续下一次循环。意味着在 i 不是偶数的情况下,第 8~11 行将不执行,直接执行 i++,然后进行 i <= 10 判断,如果条件成立则进入下一次循环,否则退出循环。
第 8 行同样是一个判断条件,如果 i 的值为 4,则执行 continue 语句,即第 11 行不执行,直接执行 i++,然后进行循环条件判断,如果成立则进入下一次循环,否则退出循环。如果 i 是偶数,并且 i 不等于 4,将执行第 11 行,即将其输出。
continue 语句不仅可以在 for 循环中使用,也可以在 do-while、while 循环中使用,方式相同,都是书写在循环体中,碰到 continue 语句将终止本次循环,进入下一次循环。
2) continue语句配合标签
continue 语句可以配合标签使用,该标签必须是为循环指定的名字,不能是普通代码块。当程序执行到 continue 语句后,会回到标记的所在位置继续指定循环的下一次循环。与 break 类似,continue 所处的循环也可以是嵌套的,continue 后所书写的标签名可以是当前循环的标签名,也可以是外层循环的标签名。
continue 语句可以出现在 while、do-while 以及 for 循环中用来控制语句的跳转,在此以 for 循环为例进行语法的说明,具体语法如下:
标签名1:for(;;) { 循环1中的语句… 标签名2:for(;;) { 循环2中的语句1 if (跳转条件) { continue 标签名1/标签名2; } 循环2中的语句2 } 循环1中的语句… } 循环后的代码…在此,continue 如果跟的是标签名 2,则跳转到标签 2 对应的循环,即中止循环 2 的当前循环,进入下一次循环,与直接使用 continue 结果一样;如果跟的是标签 1,则跳转到标签 1 对应的循环,直接结束外层循环的当前循环(循环 1 中嵌套的循环将直接终止),进入外层循环的下一次循环。此处语法仅仅是两层嵌套循环,实际可以是很多层,含义与此一样。
接下来,利用 continue 配合标签使用实现九九乘法表。
public class Demo { public static void main(String[] args) { System.out.println("-------九九乘法表-------"); a: for (int i = 1; i <= 9; i++) { b: for (int j = 1; j <= 10; j++) { System.out.print(j + "*" + i + "=" + i * j + "\t"); if (i == j) { System.out.println(); continue a; } } } } }程序的运行结果如下:
-------九九乘法表------
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
内层循环条件是 j <= 10,即从内层循环来看它应该循环 10 次。第 7 行是一个判断,如果 j 和 i 的值相等,则执行第 8 行和第 9 行语句。第 9 行意味着继续 a 标签对应的循环,即外层循环,执行该语句将结束内层循环,直接进行外层循环的 i++,然后进行外层循环的循环条件判断,如果条件成立则进入外层循环的下一次循环。
从结果很明显可以看出,内层循环并没有执行 10 次,而是到达 i == j 时就终止了,进入了外层循环的下一次循环。