Java中的"goto"语句妙用
作者:Crazypokerk_ 发布时间:2023-10-10 03:54:32
Java goto语句妙用
今天和朋友聊天的时候,无意间聊到了 goto 语句,但是在 Java 中, goto 是保留关键字,但是朋友说 Java 中有和 goto 类似效果的语句,我竟然一点都不知道!顿时感觉 Java 白学了!心里万马奔腾!?
立马回来查资料+写demo,还有这种操作???!!!哭了哭了。。。
Java label
众所周知,在Java中,for 循环的终止语句可以使用的有 break ,continue ,return 。但是如果是两层以上的for循环,想要从里层跳出到最外层,即跳出所有for循环,上面的这三种就不好实现了。此时我们就可以用 自定义名 + ' : '(冒号)实现。直接看代码:
public class JavaLabel {
public static void main(String[] args) {
//此处可以自定义名
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j == 5) {
break outer;
}
System.out.println(j);
}
}
}
}
label 关键字可以配合 break 和 continue 使用,以上代码,只要进入 for 循环,就会直接终止整个两层 for 循环,实现了我们想要的结果。
反编译
我们再用 javap 工具反编译一下:
可以看出 Java 字节码在底层也是使用了 goto,所以,终归还是用的 goto ,落叶归根啊!
也算涨了知识,感谢我这位朋友,特此记录。
“goto”——标签(基本用法+实例)
1.GoTo简介
在编程语言中,goto一开始就存在。在学习汇编语言的时候,就有指令跳转的程序控制语句,其实程序跳转在编程语音中是普遍存在的,像c,c++,java等语言中if,for等都是程序跳转,如果你查看最终编译生成的汇编代码,你就会发现这没有什么特别的。
2.那么为什么goto的名声这么不好呢?
goto语句名声不好,还是要归功于goto语句是在源码级上的跳转。破坏结构化设计风格;经常带来错误或隐患,它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。所以,如果你在使用的时候要多加小心。
3.java中的goto——标签
虽然goto语句有一些不好的地方,但是事实上goto在某些时候还是很好用的。java对于这个问题,采取的是中庸之道,java没有goto,但是采用了具有相同机制的标签
label:
while(或其他循环语句)
注:标签与迭代之间什么代码都不要有!
java引入标签是为了解决中断嵌套循环,因为如果我们使用了嵌套循环时,break和continue只能中断当前循环,也就是只能中断内部循环,而外部循环还是在的,那么我们来测试一下
public class label {
public static void main(String[] args) {
int i=9;
while (i > 3){
while (i > 3){
if (i<=5) {
System.out.println();//换行
break ;
}
System.out.print(i);
i--;
}
System.out.print(i);
i--;
}
}
}
输出结果:
9876
5
4
为什么是这个结果呢,因为我们break只跳出了内层循环,所以执行了外部循环的输出i后,i–,又再次进入到了内层循环,输出了一个换行。
当我们使用标签时
public class label {
public static void main(String[] args) {
int i=9;
label1:
while (i > 3){
while (i > 3){
if (i<=5) {
System.out.println();//换行
break label1;
}
System.out.print(i);
i--;
}
System.out.print(i);
i--;
}
}
}
输出结果:
9876
尽管标签是写在循环的前面,但是当我们使用跳转的时候,还是直接跳过了这个循环(后面的54没有输出)
当我们使用continue 标签时
public class label {
public static void main(String[] args) {
int i=9;
label1:
while (i > 3){
while (i > 3){
if (i<=5) {
System.out.println();//换行
continue label1;
}
System.out.print(i);
i--;
}
System.out.print(i);
i--;
}
}
}
你会发现程序陷入了死循环,continue只是让我们程序跳转到了标签处,但是还是会再次进入循环,也就是说在这个程序中,程序一直卡在i=5 输出换行。
4.总结
java保留标签的唯一目的是中断嵌套循环,所以标签的位置在循环语句上面,之间什么都不写
label:
while(或其他循环语句)
使用break+标签时,会跳过标签下面的循环体(尽管标签是在循环体上面)
使用continue+标签时,会重新进入标签下面的循环体
来源:https://blog.csdn.net/Crazypokerk_/article/details/93359970
猜你喜欢
- 前言在消息发送过程中,生产者从NameServer中获取到了指定Topic对应的Broker信息,在同步发送消息的代码中,如果消息发送失败,
- session简介做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话
- @RequestBody配合@Valid校验入参参数自定义一个Controllerimport com.example.demo.pojo.
- Java流程控制用户交互Scannerjava.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入基本语
- 这篇文章主要介绍了设计模式在Spring框架中的应用汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 一、安装JDK1.卸载旧版本或者系统自带的JDK(1)列出所有已安装的JDKrpm -qa | grep jdk(2)卸载不需要的JDKyu
- 本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下效果图:分析:左右两边可以
- 一、饿汉式单例类public class Singleton { privat
- 本文实例为大家分享了java代码统计小程序,供大家参考,具体内容如下可以测试每周你的工作量package rexExp;import jav
- 一、整合原理二、导包(41个)1.hibernate(1)hibernate/lib/required(2)hibernate/lib/jp
- 自定义Starter命名规则注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starte
- 各位亲们可以尝试以下代码:注:这里我就只有一个html标签对来说明问题了,首部之类的东西,自己添加。<html> &n
- 这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 目录问题案例原因分析源码分析解决方法备注问题案例来个简单点的例子public static void main(String[] args)
- 一、实现对ScrollViewer样式的自定义主要包括:1、滚动条宽度设置2、滚动条颜色3、滚动条圆角4、滚动条拉动时的效果mouseove
- C#使用GET、POST请求获取结果,这里以一个简单的用户登陆为例。1、 使用GET请求获取结果1.1 创建LoginHandler.asp
- zenDiscovery实现机制ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到
- 前言Go 语言比 Java 语言性能优越的一个原因,就是轻量级线程Goroutines(协程Coroutine)。本篇文章深入分析下 Jav
- 一、导入和导出导入:通过解析excel表格中的数据,然后将数据放到一个集合中,接着通过对持久层操作,将数据插入到数据库中,再加载一下页面,从
- 本文实例讲述了Android TextView跑马灯效果实现方法。分享给大家供大家参考,具体如下:public class MyTextVi