0.前言

尽管Java的设计者将goto作为保留字,但实际上并没有打算在语言中使用它。通常,使用goto语句被认为是一种拙劣的程序设计风格。当然,也有一些程序员认为反对goto的呼声似乎有些过分(例如,Donald Knuth就曾编著过一篇名为《Structured Programming with goto statements》的著名文章)。这篇文章说:无限制地使用goto语句确实是导致错误的根源,但在有些情况下,偶尔使用goto跳出循环还是有益处的。Java设计者同意这种看法,甚至在Java语言中增加了一条带标签的break,以此来支持这种程序设计分格。

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语句是相同的。如下例:

Scanner in = new Scanner(System.in);

int n;

read_data;

while(...) //this loop statement is tagged with the label

{

...

for(...) //this inner loop is not labeled

{

System.out.print("Enter a number >= 0: ");

n = in.nextInt();

if(n < 0) // should never happen - can't go on

break read_data

//break out of read_data loop

...

}

}

//this statement is executed immediately after the labeled break

if(n < 0) //check for bad situation

{

//deal with bad situation

}

else

{

//carry out normal processing

}

3. 与continue语句配合使用

带标号的continue语句只能在循环体内部使用,使程序终止当前循环;从循环体内部跳出到标签所指的循环控制层,再判定该循环判定表达式,以决定是否再次进入该循环,图5-16演示了这一过程。这与带标号的break语句终止该循环不同。

与带标号的break语句一样,当带标号的continue语句,从第n层退出到n-1层时,其效果与不带标号的continue语句是相同的。

Scanner in = new Scanner(System.in);

while(sum < goal)

{

System.out.print("Enter a number: ");

n = in.nextInt();

if(n < 0)continue;

sum += n; //not executed if n < 0

}

在优质的Java程序中,标签语句是比较不常用的。因为Java提供了丰富的循环语句,可适用于绝大多数场合。

4.注释

事实上,可以将标签应用到任何语句中,甚至可以应用到if语句或者块语句中,如下所示:

label:

{

...

if(condition) break label; //exits block

...

}

//jumps here when the break statement executes

因此,如果希望使用一条goto语句,并将一个标签放在想要跳转到的语句块之前,就可以使用break语句!当然,并不提倡使用这种方式。另外需要注意,只能跳出语句块,而不能跳入语句块。

java跳转语句包含goto_Java 语句标签实现goto跳转相关推荐

  1. MySQL三 插入语句包含查询语句

    目的: 对 A 表执行插入方法时,有个字段的值需要从 B 表中查询出,同时以参数的形式插入到 A 表中.老规矩,偷懒... 过程: sql = "INSERT INTO A SET User ...

  2. java跳转语句包含goto_Java 的跳转语句中 _______( 包含 / 不包含 )goto 语句。_学小易找答案...

    [单选题]承压水井和潜水井是根据()来划分的. [单选题]下列哪个叙述是正确的? [其它]Demo编程:分别用以下布局实现如图所示界面: 线性布局(LinearLayout) 表格布局(TableLa ...

  3. 【Java基础篇】try catch finally语句包含return语句时的执行过程

    网上有很多人探讨Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行? 很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally ...

  4. html点击跳转当前页面刷新,a标签组织页面跳转,并且刷新当前页面

    1.阻止a标签跳转的方式:这里一共总结了5种 第一种: html code: 跳转 第二种: html code: 跳转 javascript code: function test(){ alert ...

  5. java switch case 跳转_Java switch case语句

    1.switch case 语句有如下规则: switch 语句中的变量类型可以是: byte.short.int 或者 char.从 Java SE 7 开始,switch 支持字符串 String ...

  6. JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)

    Java流程控制语句 本博文将对JAVA中组成各种结构的控制语句进行重点介绍,主要内容是区别于C/C++中的流程控制语句的重点解析. 1.顺序语句 顺序结构中的语句可分为:表达式语句.空语句和复合语句 ...

  7. java中case语句_Java:switch-case语句

    我们生活中总会出现形形色色的选择,中意选择的不同,往后的故事往往也不尽相同.计算机中想要实现现实中的选择交互,就需要用到"选择语句".当然简单的选择可以用if...else..., ...

  8. 了解掌握Java的循环语句、条件语句、分支语句(Java 从自学到就业 第3天)

    Java 学习记录 第三天 由于本渣渣是前端转行Java,所以编辑器的选择就直接用 webstorm 同公司的 idea 学习目标 了解掌握Java的循环语句.条件语句.分支语句 学习内容 while ...

  9. Mybatis中XML的文件SQL语句与动态sql标签(trim|where|set|foreach|if|choose|when|otherwise|bind)

    在xml中写sql语句有很多的规范.标准,有时候想要找对应的例子还得翻一翻以前的代码,这里干脆对遇到的情况做个记录. 一,新建XML文件 <?xml version="1.0" ...

最新文章

  1. python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...
  2. 8类网线利弊_超6类网线和7类网线有何区别?有何用途?家用电脑,看这
  3. 【若依(ruoyi)】重置密码SQL脚本
  4. FastDFS分布式文件系统设计原理
  5. java如何写安卓接口文档_android、java制作sdk以及自动生成文档
  6. php dbutils 使用,dbutilsapi
  7. STM8单片机低功耗---活跃停机(Active Halt)模式实现-1
  8. 开源流媒体系统:OBS ( Open Broadcaster Software ) 介绍
  9. 56个民族HTML代码
  10. wheel文件安装以及换源安装
  11. android+开机+无命令,红米手机怎么刷机
  12. jQueryXML笔记
  13. CVPR 2022|U2PL:使用不可靠伪标签的半监督语义分割
  14. v06.03 鸿蒙内核源码分析(调度队列) | 内核调度也需要排队 | 百篇博客分析HarmonyOS源码
  15. [附源码]Python计算机毕业设计电影票网上订票系统
  16. python修复老照片_老照片修复还原
  17. 医疗时鲜资讯:互联网+医疗,技术 OR 需求
  18. AIGC 语言大模型研究报告
  19. php类似百度快照,php获取百度收录、百度热词及百度快照的方法,php百度快照_PHP教程...
  20. Unity之 制作卷轴展开显示画面效果

热门文章

  1. python使用正则表达式检测给定的URL地址是否合法
  2. python代码通过日期获得星期信息(根据日期获取星期day of the week)
  3. 数据挖掘应用于流失分析的整体思路
  4. linux无法设置日期 不允许的操作,如何解决系统时间无法修改的问题
  5. python 打包wheel文件,自己的SDK包
  6. 10.LeetCode第九题--有效的数独--哈希表的经典应用
  7. 十四、进程互斥的硬件实现方法
  8. Pytorch笔记(python--类与对象(class and module))
  9. 大数据分布式集群搭建(3)
  10. 一致性直线提取--Coherent Line Drawing