
3.5.1 break语句
在分支语句的学习中,大家已经接触过break语句,可以用它来结束switch分支语句的继续执行。除此之外,break还有两种用法,一种是在循环体中强制退出循环,另一种是配合标签使用实现类似C语言goto语句的效果。
1.使用break强制退出循环
在程序中,有时需要强行终止循环,而不是等到循环条件为false时才退出循环。此时,可以使用break语句来实现这种功能。break语句可以出现在循环体中,其作用是使程序立即退出循环,转而执行该循环外的语句。如果break语句出现在嵌套循环的内层循环中,则只会终止当前内层循环,外层循环则不受影响。break语句在3种循环语句中都可以使用,书写在其重复执行语句块中,一般配合if语句进行使用,执行流程如图3.12所示。

图3.12 break控制循环流程图
接下来,根据break语句的特性,书写一个案例:采用while循环语句来循环输入并打印学生成绩,如果输入成绩为-1则退出循环,如例3-13所示。
【例3-13】 Demo0313.java

程序的运行结果如下:
-------输入学生成绩------ 90 学生成绩为:90.0 -------输入学生成绩------ -1 循环终止!
例3-13中,第7~14行为一个while循环语句,其中while(true)即循环条件的结果一直都是true,循环将会一直执行,这也就是所谓的死循环。第10行书写了一个if条件语句,当第1次输入成绩为90时,该条件语句的判断条件不成立,if语句中的语句将不会执行,继续执行第13行语句输出该学生的成绩,输出成绩后再次进行循环条件的判断,因为没有循环变量更替,所以该条件的结果恒为true,再次录入学生成绩。第2次输入成绩为-1,第10行中if条件语句的判断条件score < 0成立,此时执行了第11行的break语句,循环终止,然后执行了while循环之外的第15行语句。
break语句不仅可以在while循环中使用,也可以在do-while、for循环中使用,方式相同,都是书写在循环体中,碰到break则循环终止。此处仅举例了break语句在while循环体中的使用,其他情况类似,不再赘述。
2.break语句配合标签
break语句并不局限于终止一个循环语句或者退出switch分支语句,它还可以配合标签使用,用来终止一个或任意多个代码块,通过它可以实现代码跳转到指定位置继续执行。
标签的命名需要遵循标识符的命名规则,标签名后书写一个冒号,冒号后为标签中要执行的代码块,该代码块中可以使用“break 标签名”来退出该代码块,具体语法如下:
标签名1: { 代码块1中的语句… if (跳转条件) { // 一般需要配合if使用,否则break后不可以书写代码 break 标签名1; // 执行到break语句时,将结束该代码块,执行代码块后的代码 } 代码块中1的语句… } 代码块后的代码…
接下来,编写一个简单的案例来演示break配合标签使用的语法,如例3-14所示。
【例3-14】 Demo0314.java

程序的运行结果如下:
代码块语句1 代码块后的代码
例3-14中,第5行的labelName是标签名,相当于给后边{}中的代码块起了一个名字。第6行声明了一个变量i,初始值为1,作为终止代码块的条件。第8行是一个判断条件,i的初始值为1,因此1 == 1这个条件成立,执行if后的break语句,break后跟的是刚才的标签名,表示跳出以labelName命名的代码块,此时第11行的语句将不再执行,直接跳转到labelName标签对应的代码块后继续执行,也就是执行第13行语句。
知识点拨:程序中使用{}将一句或多句代码括起来即可组成一个代码块,这个代码块并不一定是在分支后或者循环后,可以独立存在。
在此需要注意的是,标签定义的代码块中有可能仍然有标签定义,即代码块是可以进行嵌套的,此时如果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,则直接终止所有循环,如例3-15所示。
【例3-15】 Demo0315.java

程序的运行结果如下:
退出循环时x为:1 退出循环时y为:1 退出循环时z为:8
例3-15中,第6行,labelX是第1层循环的标签,labelX后正常应该是{}括起来的代码块,但是该代码是一个for循环,是一个整体,除此之外没有其他代码,因此可以省略{}。第7行labelY是第2层循环的标签。第8行labelZ是第3层循环的标签。第9行是一个判断条件,如果x + y + z的结果为10则执行第10行代码。该程序执行过程中,此时x = 1,进入第1层循环体,第1层的循环体是第2层循环;此时y = 1,进入第2层循环的循环体,第2层的循环体是第3层循环;当第3层循环到z = 8时,判断条件成立,此时x = 1、y = 1、z = 8,执行第10行语句,直接退出labelX对应的循环,即第1层循环。因此,此时z++、y++、x++都不会执行,将直接退出3层循环,转而开始执行第15行代码。