【细节推敲】Java不支持goto的原因、以及Java中标签的用法


什么是goto?

  • goto是一种程序控制,可以指定程序跳往指定的代码位置。
  • 但是,goto是在源码级别上的跳转!不是汇编代码级别!因此容易发生问题!

如果一个程序总可以从一个位置,跳到代码的另一个位置,就很容易影响程序控制的流程。尤其是Edsger Dijkstra 发表的论文说goto有害,甚至建议从关键词中删除goto。(这个论文其实是在反对标签的滥用!)

  • 问题到底出在哪里?其实不是使用goto有问题(goto有时候确实是流程控制的最佳手段),而是不能滥用goto语句

Java如何对待goto?

  • 既然不是goto的问题,而是滥用goto的问题。Java选择中庸的方式,也就是保留关键字,但是不支持goto跳转!
  • Java其实也可以支持类似功能(使用break和continue
  • 但是!break和continue和goto不是一个东西!
  • break和continue只是中断迭代的语句;之所以将它们和goto放在一起探讨,是因为它们用着相同的机制:标签机制

标签机制

  • 标签机制在很多语言中都存在(像是Golang)它长下面这个样子
lable:

他其实是用来和goto搭配进行定点跳转的。
就比如说我程序中有几处lable,但是goto的时候不能直接写goto代码的第几行,我需要写goto到第几个lable

  • 但是Java中标签唯一起作用的地方就是break和continue了【只能在迭代语句之前!!其他地方放不了!编译不通过!

如果下面内层的迭代来到continue lable1;那么就会continue外层的循环;同理内层来到break lable1;则会直接结束外层的循环,而不是结束内层循环。

public class Solution {
    public static void main(String[] args) {
        int sum = 0;
        lable1:
        while (true) {
            System.out.println("out");
            while (true){
                sum++;
                if (sum == 10) {
                    continue lable1;
                }
                if (sum == 12){
                    break lable1;
                }
                if (sum == 13){
                    break;
                }
            }
        }
    }
}

输出:
在这里插入图片描述
【如果只有一层循环,那么使用lable的效果跟不加lable的效果是一样的!】


总结

1.Java不支持goto,但是支持标签。
2.标签只能放在循环的前面,紧贴着循环,中间放别的哪怕是打印也编译不通过!
3.标签存在的唯一原因是:Java存在循环嵌套。标签的作用当然也就是在多层循环嵌套中进行流程控制;
4.Java中的标签不像是其他语言的标签。。功能被限制了(只能跳转到外层迭代,而不是任意位置),这样的做法也为Java语法带来安全性。

【end】

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值