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

  • Post author:
  • Post category: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】



版权声明:本文为weixin_37749732原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。