《Java 7程序设计入门经典》一3.14 像使用goto语句一样使用break语句

3.14 像使用goto语句一样使用break语句

除了用于switch语句和循环外,break语句也可以用提供像goto语句一样的用法。由于goto语句是一种改变程序流的非结构化方法,因此Java并没有goto语句。使用了很多goto语句的程序一般难以理解和维护。但是,有一些使用goto语句的地方是有用且合理的。例如,在退出一组嵌套很深的循环时就是这样。为了应对这种情况,Java定义了break语句的扩展形式。例如,通过使用这种形式的break语句,可以从多层代码块退出。这些代码块不必是循环或是switch的一部分。它们可以是任意的代码块。另外,还可以精确指定执行恢复的位置,因为break的这种形式使用了标签。break语句具有goto语句的优点,还避免了goto语句的一些问题。
这种有标签的break语句的一般形式如下:

break label;

这里,label是标签名,标识一句代码或一个代码块。当这种形式的break语句执行时,控制权从标记的语句或块中转移出。标记的语句或块必须包含break语句,但是它不一定是最近的语句或块。例如,这意味着,可以用有标签的break语句退出一系列嵌套代码块。但不能使用break语句将程序控制权转移到不含break语句的块中。
为了给语句和块起个名字,可以在其开始处加标签。标签(label)是后加冒号的任意有效Java标识符。一旦为语句和块加了标签,就可以将这个标签作为break语句的目标。这样做可以执行语句或块后的语句。例如,下面的程序有三个嵌套的循环。


程序的输出如下所示:

让我们仔细看看这个程序,以理解为什么生成这样的输出。当i为1时,第一个if语句成功,使break跳转到由标签one定义的代码块的末尾。这使得程序输出“After block one”。当i为2时,第二个if语句成功,使控制权转移到由标签two标注的块的末尾。这使程序顺序输出“After block two”和“After block one”。当i为3时,第三个if语句成功,控制权转移到标记为three的语句的末尾。这时,三条消息都显示。
再看一个例子。这个例子使用break语句从一系列嵌套的for循环中跳出。当内层运行的break语句执行时,程序控制权跳转到外层for循环定义的块的末尾,这个块标记为done。这使得三重循环的剩余部分不再执行。

程序输出如下所示:

在何处精确放置标签十分重要,特别是当涉及循环时。例如,考虑下面的程序:

程序输出如下所示:

在程序中,两个嵌套的循环只有一点不同。在第一个嵌套循环中,标签在外层for语句的前面。在这种情况下,当执行break语句时,将控制权转移到整个for块的末尾,跳过外层循环迭代的其他代码。在第二个嵌套循环中,标签在外层for语句的左花括号前。于是,当执行break stop2时,控制权转移到外层for语句块的末尾,而不是循环的末尾。这引起下一次迭代的发生。
注意,不能跳转到不是为包括break语句的语句或块定义的标签。例如,下面程序是无效的,不能编译。

因为标注为one的for循环不包括在第二个for循环中的break语句,所以不可能将控制权转移到那个标签。

时间: 2024-09-20 20:49:14

《Java 7程序设计入门经典》一3.14 像使用goto语句一样使用break语句的相关文章

《Java 7程序设计入门经典》一导读

前 言 本书通过Java语言来讲解编程的基础知识.该书假设读者之前没有任何编程经验.本书首先介绍最基本的知识,例如,如何编译和运行Java程序:接着,讨论关键字.运算符和一些形成Java语言的构造.本书还会涉及Java的应用编程接口(Application Programming Interface,API)库.其中,包括Swing框架,它可以用来创建具有图形用户界面(Graphical User Interface,GUI)的程序.还包括集合框架,它可以用来存储对象集合.简而言之,本书旨在对J

《Java 7程序设计入门经典》一3.13 使用break语句退出循环

3.13 使用break语句退出循环 在循环过程中,可以使用break语句强制退出循环.这时,循环体中剩余的代码不再执行,循环条件也不再测试.当在循环中遇到break语句时,循环停止,程序控制跳转到循环后的语句上.下面是一个简单的例子: 该程序产生下列输出: 可以看到,尽管for循环设计成从0循环到变量num(这里num是100),但是当i的平方大于等于变量num时,break语句使得其更早停止了. break语句可用于Java的任意一种循环,包括特意写成的无限循环.例如,下面的程序一直读取用户

《Java 7程序设计入门经典》一3.17 习题

3.17 习题 1.写一个程序,从键盘读入字符,直到接收到一个英文句号(.).程序需要计算输入的空格的个数.在程序结束时输出总结果. 2.请写出if-else-if梯队的一般形式. 3.针对下列程序 其中最后的else子句与哪个if配对? 4.写一个for循环语句,从1000计数到0,步进值为-2. 5.下面的代码片段是否有效? 6.请解释break语句的用途(包括其两种形式.) 7.在下面的代码片段中,break语句执行后会显示什么? 8.下面程序片段的输出是什么? 9.for循环中的迭代表达

《Java 7程序设计入门经典》一2.16 习题

2.16 习题 1.为什么Java严格指定基本数据类型的范围和行为? 2.什么是Java的字符类型?它与其他语言的字符类型有什么区别? 3.判断正误:因为非零值是真值,所以boolean值可以是任何值. 4.给定输出: 仅使用一个字符串,写出利用println()方法产生这个输出的方法. 5.下面代码片段有什么错误? 6.请解释递增运算符前缀形式和后缀形式的区别. 7.请举例说明带有"短路"功能的AND运算如何用来防止除以0带来的错误. 8.在表达式中,byte类型和short类型会提

《Java 7程序设计入门经典》一3.15 使用continue语句

3.15 使用continue语句 也可能要求忽略循环的正常控制结构,提前开始下一次循环.这由continue语句完成.continue语句会有选择地跳过剩下的任何代码和对循环控制条件的判断,强迫开始下次循环.所以,从本质上看,continue语句与break语句具有互补关系.例如,下面的程序用continue语句帮助输出0-100之间的整数. 因为奇数会使循环的迭代提前结束并忽略println(),所以该程序只输出偶数.这使用返回除法余数的运算符%完成.如果该数是偶数,除以2后的余数就是0,i

《Java 7程序设计入门经典》一1.11 两种控制语句

1.11 两种控制语句 在方法内部,语句的执行是按语句出现的顺序执行.换句话说,执行从一条语句到另一条语句,自上而下顺序执行.但是,也可以根据一些条件改变流程.这样的情况在编程界非常常见.下面是一个例子.一个网站也许会需要输入一个密码.代码必须保证在密码无效时拒绝访问.于是,如果输入了无效的密码,则不能执行那些需要访问权限的代码.还是这个例子,在输入无效的密码时,可能会给用户两次或更多次正确输入密码的机会.为了解决这种情形,需要改变程序的执行流.Java提供了一种丰富的控制语句(control

《Java 7程序设计入门经典》一第3章 程序控制语句

第3章 程序控制语句 本章要点 从键盘中输入字符: 了解if语句的完整形式: 使用switch语句: 了解for循环的完整形式: 使用while循环: 使用do-while循环: 使用break跳出循环: 使用break来代替goto: 应用continue关键字: 循环嵌套. 本章将学习如何控制程序的执行流.Java的程序控制语句可以分为以下三类: 选择语句 迭代语句 跳转语句 选择语句允许程序选择不同的执行路径.迭代语句允许重复一段代码.跳转语句允许程序控制直接从一个地方跳转到另一个地方.J

《Java 7程序设计入门经典》一3.5 switch语句

3.5 switch语句 Java的第二个选择语句是switch语句.switch语句提供了多个分支.于是,它使程序可以在多个选项中做出选择.尽管一系列嵌套的if语句可以执行多路测试,在许多情况下,switch语句是更有效的方法.它像这样工作:表达式的值与一系列的常数比较.当找到一个选项时,执行与这个匹配项相关的语句序列.switch语句的一般形式为: 对于JDK 7以前的Java版本,控制switch的表达式expression必须是byte.short.int.char或枚举类型.(枚举类型

《Java 7程序设计入门经典》一3.8 for循环中的一些特殊情况

3.8 for循环中的一些特殊情况 因为for循环有很多变化,所以for循环是Java语言中用处最多的语句.一个最常见的用法是有多个循环控制变量.在使用多个循环控制变量时,每个表达式的初始化表达式和迭代表达式用逗号分隔.下面是一个简单的例子: 程序输出如下所示: 注意,逗号将两个初始化表达式和迭代表达式分开的方式.当循环开始时,在循环的初始化部分初始化变量i和变量j.每次循环开始时,递增变量i,递减变量j.当i大于等于j时结束循环.理论上,可以有任意数量的循环控制变量,但实际上,两三个循环控制变