java中的GOTO

1. 标签语句概述
Java允许在语句前加上标签前缀,构成标签(label)语句。其一般格式为:
标识符:语句
其中标识符应是Java语言中合法的标识符;语句可以是任意Java语句,包括简单语句、复合语句(语句块)、控制转移语句、空语句。但由于在Java中,标签语句仅能与break和continue语句配合使用,所以给简单语句或空语句加标签没有意义。
含义是,为冒号“:”后的语句指定名为“标识符”的标签。如:
Outer:
{
......
}
Outer2:while(true)
{
......
}
提及标签语句,最好先介绍一下它的老搭档goto语句。goto语句可以说是程序控制结构的始祖,它在程序中与标签语句配合使用可灵活地构造任意复杂的业务逻辑。但由于它过于灵活,在编程时常被随意跳转,使程序控制结构变的复杂而且混乱。随着E. W. Dijkstra著名的“goto语句有害论”的问世和广泛争论,goto语句也逐渐失宠,并在Java中被取消。
当然,goto语句也并非一无是处,在一些情况下,如需从嵌套很深的循环中退出时,它还是组织控制流程的最佳手段。为此,Java虽取消了goto语句,但Java仍保留了goto语句的优点。通过标签语句与break、continue语句的配合,构造带标号的break语句和带标号的continue语句,允许程序从循环体内部退出到循环体外部或者从语句块内部退出至语句块外部,但不允许从外部跳转至内部。带标号的break,continue语句格式如下:
break  labelIdentifier;
continue labelIdentifier;
带标号的break和continue语句,只能在标签所指的语句块或其嵌套包含的内层语句块中使用。表示从语句块内部退出到指定语句块中。如下面程序第9行的break语句用法是不允许的。
 
2. 与break语句配合使用
带标号的break语句,可以使程序从复合语句或循环体内部退出到指定标签所标识的外层语句块末尾,继续执行之后的语句。如可以从最里层(第n层),退出到最外层(第1层),也可退出到第n-m层(n>m)。图5-15演示了这一语义。
当带标号的break语句,从第n层退出到n-1层时,其效果与不带标号的break语句是相同的。如下例:
 
 
 
图5-15   带标签的break语句工作原理
带标号的break语句最常用的用法是退出循环嵌套,当程序需要从嵌套很深的循环中退出时,它是非常有价值的,因为它可大大简化代码的执行过程。例5.16显示了这一道理。
【例5.16】
 
当程序从第5层循环中退出到第一层循环时,循环均被终止。
3. 与continue语句配合使用
带标号的continue语句只能在循环体内部使用,使程序终止当前循环;从循环体内部跳出到标签所指的循环控制层,再判定该循环判定表达式,以决定是否再次进入该循环,图5-16演示了这一过程。这与带标号的break语句终止该循环不同。
与带标号的break语句一样,当带标号的continue语句,从第n层退出到n-1层时,其效果与不带标号的continue语句是相同的。
下面再来关注一下例5.12中九九乘法表的打印,用带标号的continue语句实现相同功能。
【例5.17】
 
 
程序执行结果,同例5.13。
 
在优质的Java程序中,标签语句是比较不常用的。因为Java提供了丰富的循环语句,可适用于绝大多数场合。

你可能感兴趣的:(java,编程)