Java的“Goto”与标签及使用详解
goto在Java中是一个保留字,但在语言中并没有用到它;Java没有goto。但是,Java也能完成一些类似于跳转的操作,主要是依靠:标签。
为什么要使用标签
在迭代语句中,我们可以使用break和continue来中断当前循环。但如果出现循环嵌套的情况,使用break和continue只能中断内层循环,无法控制到外层的循环。这时,我们就可以使用标签结合break和continue,中断内层循环,跳转到标签所在的地方。
标签声明
标签的声明很简单,加个冒号就行,就像下面这样:
label1:
标签使用
在Java中,标签起作用的唯一地方是在迭代语句之前,注意“唯一”,也就是说不能在其它地方单独使用,只能结合迭代语句共同使用。
下面这个例子展示了带标签的break以及continue语句在while循环中的用法:
/** * @author zouqingfeng */ public class GotoLabelTest { public static void main(String[] args) { int i = 0; label1: while (true) { System.out.println("----------------外层循环开始----------------"); while (true) { i++; System.out.println("i=" + i); if (i == 1) { System.out.println("continue"); continue; } if (i == 3) { System.out.println("continue label1"); continue label1; } if (i == 5) { System.out.println("break"); break; } if (i == 7) { System.out.println("break label1"); break label1; } System.out.println("----------------内层循环结束----------------"); } System.out.println("----------------外层循环结束----------------"); } System.out.println("End"); /* Output: ----------------外层循环开始---------------- i=1 continue i=2 ----------------内层循环结束---------------- i=3 continue label1 ----------------外层循环开始---------------- i=4 ----------------内层循环结束---------------- i=5 break ----------------外层循环结束---------------- ----------------外层循环开始---------------- i=6 ----------------内层循环结束---------------- i=7 break label1 End */ } }
从打印的结果可以看出
当i==1时,执行continue后,没有执行“内层循环结束”打印语句,而是打印了“i=2”,说明continue使执行点回到内层循环起始处,并继续下一次迭代。
当i==3时,执行continue label1后,没有执行“内层循环结束”打印语句,也没有执行“外层循环结束”,而是打印了“外层循环开始”,说明带标签的continue,对内外层循环都起作用,continue label1同时中断内外层循环,直接跳转到label1标签处,随后,从外部循环开始下一次的迭代。
当i==5时,执行break后,没有执行“内层循环结束”,但执行了“外层循环结束”,说明break只中断并跳出内层循环,回到了外层循环中。
当i==7时,执行break label1后,直接打印了“End”,说明带标签的break,对内外层循环都起作用,break label1同时中断内外层循环,直接跳转到label1标签处,但并不重新进入迭代。也就是说,break label1完全终止了两个循环。
总结
1.一般的continue只会对其所在的循环起作用,退回循环的开头,并继续执行。
2.带标签的continue会使执行点到达标签的位置,并重新进入紧接在标签后的循环。
3.一般的break会中断并跳出当前循环。
4.带标签的break会中断并跳出标签所指的循环。
5.在Java中,标签起作用的唯一地方是在迭代语句之前。
6.在Java中,使用标签的唯一理由是有嵌套循环存在,并且想从多层嵌套中break或continue。
相关文章
解决Mybatis-plus和pagehelper依赖冲突的方法示例
这篇文章主要介绍了解决Mybatis-plus和pagehelper依赖冲突的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-04-04Atomikos + MybatisPlus解决多数据源事务一致性问题解决
在实际项目的开发过程中,我们经常会遇到在同一个项目或微服务中牵涉到使用两个或多个数据源的,本文主要介绍了Atomikos + MybatisPlus解决多数据源事务一致性问题解决,具有一定的参考价值,感兴趣的可以了解一下2024-07-07idea中MavenWeb项目不能创建Servlet的解决方案
这篇文章主要介绍了idea中MavenWeb项目不能创建Servlet的解决方案,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2020-02-02使用arthas命令redefine实现Java热更新(推荐)
今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新,感兴趣的朋友跟随小编一起看看吧2020-05-05
最新评论