goto在Java中的替代(break和continue的进阶用法)
文章目录
- 前言
- 一、goto是什么?
- 二、goto与Java的关系
- 1.关系
- 2.Java中的标签
- 2.break和continue的进阶用法
- 总结
前言
goto语句是在源码级上的跳转,这使得其招致了不好的声誉。Dijkstra发表了著名论文《Goto considered harmful》(goto有害)若一个程序总是从一个地方跳到另一个地方,那么还有什么办法能识别程序的流程控制呢?
一、goto是什么?
goto起源于汇编语言的程序控制:“若条件A允许,则跳进这里;否则跳到那里”。如果阅读由编译器最终生成的汇编代码,就会发现程序控制里面包含了许多跳转。(Java编译器生成他自己的“汇编代码”,但是这个代码是运行在Java虚拟机上的,而不是在CPU硬件上的。)
二、goto与Java的关系
1.关系
尽管在Java中有goto这个保留字,但在语言中却用不到它。Java没有goto,但是Java也能完成一些类似于跳转的操作,这与break和continue用法有关。总所周知,他们并不是一个跳转,而是中断迭代语句的一种方法。能够与goto相提并论的关键在于,这二者与goto有相同的机制——标签
2.Java中的标签
标签:后面带有冒号的标识符 例: label:
在Java中,标签起作用的唯一地方恰好是在迭代语言之前。这句话的意思是:在标签和迭代之间置入任何语句都是不好的。而在迭代之前设置标签的唯一理由就是:我们希望在其中一个嵌套另一个迭代或者开关。
3.break和continue的进阶用法(即结合标签)
1.代码如下(示例):
label1:outer-iteration{inner-iteration{//...continue; (1)使执行点移回到内部迭代的起始处//...break; (2)中断内部迭代,回到外部迭代//...continue label1; (3)同时中断内部迭代和外部迭代,直接转到label1处//...break label1; (4)同3}}
从上我们能注意到(3)(4)均能跳到标签处,值得注意的是label1后面不能添加任何语句
2.下面这个例子我们将更加清楚continue和break带标签的区别
public class Draft_07 {public static void main(String[] args) {int i = 0;outer:while(true){System.out.println("outer while loop");while(true){i++;System.out.println("i = "+i);if (i == 1){System.out.println("continue");continue;}if (i == 3){System.out.println("continue outer");continue outer;}if (i == 5){System.out.println("break");break;}if (i == 7){System.out.println("break outer");break outer;}}}}
}
我们会发现二者具体的区别
a.带标签的continue会到达标签的位置,并重新进入紧接在那个标签后的循环。
b.带标签的break会中断并跳出标签所指的循环。
要记住的重点是,在Java中唯一要使用标签的理由就是因为有嵌套循环的存在,而且是想从多层嵌套中break或continue
总结
《Goto considered harmful》(goto有害)论文中最反对的其实是标签而不是goto,因为实践证明程序随着标签的增加而产生的错误增加,且不利于程序的分析。但在Java由于标签的应用场合受到限制并不会引起这种问题,正如Java编程思想一书中所言的一个现象,通过限制语言的能力,反而能使一项语言特性变得更加有用。
goto在Java中的替代(break和continue的进阶用法)相关推荐
- Java跳转语句break与continue
Java跳转语句break与continue 概述: 人为的对循环执行进行控制时使用的语句 分类: break:打断 在选择语句中结束整个选择语句的 在循环语句中结束整个循环,后续循环不执行 co ...
- 解析java当中switch语句的作用和break、continue关键字的用法
解析java当中switch语句的作用和break.continue关键字的用法 A. switch语句 1.含义 是分支结构,使程序按照条件的判断结果去执行相应的程序代码. 2.语法 switch( ...
- Python自学20201202 while、for 、if、else、break、continue等相关用法
Python自学20201202 while.for .if.else.break.continue等相关用法.常用常玩,来来回回一直循环, 学这个要点,把自己当机器,跟着循环. print(&quo ...
- break与continue的的用法以及区别
/* break与continue的的用法以及区别 1. 当它们用在循环语句的循环体时,break用于立即退出本层循环,而continue仅仅结束本次循环(本次循环体内不执行 continue语句后的 ...
- c语言continue语句作用,C语言break和continue的语句用法
1.知识了解 在c语言中,为了使用循环控制更灵活,c语言允许在特定条件成立时使用break语句和continue语句控制循环的执行过程 ♞break:用于循环语句和switch语句中,它跳出所在的那一 ...
- Java循环中的break 和 continue
CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:Java学习记录 话题描述 ...
- java break的用法_Java基础break、continue语句的用法
break适用范围:只能用于switch或者是循环语句中.当然可以用于增强for循环. break作用: 1. break用于switch语句的作用是结束一个switch语句. 2. break用于循 ...
- Delphi中exit、break、continue等跳出操作的区别
Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...
- Java中static、this、super、final用法
一.static 请先看下面这段程序: public class Hello{ public static void main(String[] args){ //(1) System.out.pri ...
最新文章
- 异常检测算法:Isolation Forest
- 数据管理、数据治理、数据管控的概念区别和范围是什么?
- HDU 1425 sort(堆排序)
- python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析
- oracle用户登录的认证方式
- ajax点评wnv冠军,对话wNv高层探知焦点 剑指世界冠军铸就王者路
- Exchange 2010 创建设备室邮箱
- C# 实现软件自动更新升级程序
- Weblogic加Apache的负载均衡以及群集配置
- 抓人眼球!插画风精美的网站首页设计欣赏
- SQL SERVER将多行数据合并成一行(转载)
- CDH QuickStart VM基本使用
- java file.listFiles()按文件名称、日期、大小排序
- LINUX下载编译sqlite-jdbc的jar包
- innobackupex 恢复到mysql目录_innobackupex备份mysql恢复后迁移到新的mysql实例
- project2016资源管理
- 谷歌浏览器快捷键_一览表【Mac】
- Emacs - Verilog mode 自动实例化
- 【Unity2D好项目分享】提高游戏人物打击感
- freebase api的使用