goto在Java中的用法

发布于:2025-04-05 ⋅ 阅读:(46) ⋅ 点赞:(0)

说明:goto 在一些编程语言(如C语言)中,是用来表示跳转的,即代码执行到此处跳转到对应位置继续执行。

举例

举个例子,如下,是一个双层嵌套循环。现在我需要代码在内层循环符合某条件时跳出双层循环,即跳出整个双层循环。

    public static void main(String[] args) {
        int[][] array = new int[10][10];
        // 放入一个特殊值,作key
        array[7][7] = 1000;

        // 依序赋值
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] == 0) {
                    array[i][j] = i * array.length + j + 1;
                }
            }
        }

        // 寻找特殊值
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] == 1000) {
                    System.out.println("got it!");
                    break;
                }
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }

执行,可以看到,break 只能跳出内循环,外循环没有跳过。但按照代码描述,找出特殊值后,代码没有继续执行下去的必要。

在这里插入图片描述

解决

上面这种场景博主在项目中遇到过,可以有两种解决思路。第一种就是引入变量,设置一个开关,内循环符合条件后,修改开关,外循环判断,如下:

    public static void main(String[] args) {
        int[][] array = new int[10][10];
        // 放入一个特殊值,作key
        array[7][7] = 1000;

        // 依序赋值
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] == 0) {
                    array[i][j] = i * array.length + j + 1;
                }
            }
        }

        // 定义一个开关
        boolean flag = true;
        // 寻找特殊值
        for (int i = 0; i < array.length; i++) {
            if (flag) {
                for (int j = 0; j < array[i].length; j++) {
                    if (array[i][j] == 1000) {
                        System.out.println("got it!");
                        // 符合条件,设置开关
                        flag = false;
                        break;
                    }
                    System.out.print(array[i][j] + " ");
                }
            }
            System.out.println();
        }
    }

执行如下,能达到目的

在这里插入图片描述

第二种方式,就是使用类似 goto 的方式,可定义代码 break 跳出到某处,如下:

    public static void main(String[] args) {
        int[][] array = new int[10][10];
        // 放入一个特殊值,作key
        array[7][7] = 1000;

        // 依序赋值
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] == 0) {
                    array[i][j] = i * array.length + j + 1;
                }
            }
        }

        // 寻找特殊值
        // 打一个标签
        out:
        for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if (array[i][j] == 1000) {
                        System.out.println("got it!");
                        // 跳出到out标签
                        break out;
                    }
                    System.out.print(array[i][j] + " ");
                }
            System.out.println();
        }
    }

效果一样,但显然上面这种更优雅(zhuang b)一点

在这里插入图片描述

另外

在Java语言中,禁止C语言那种随意跳转代码执行的语法规则,但仍保留了 goto 关键字(没有特殊用法),同时支持上面这种可跳出多层循环(不仅双层循环)的语法。如果你的代码中有上述跳出多层嵌套循环的逻辑,这不失为一种选择。

个人认为Java把 goto 砍掉是对的,随意跳转代码执行提高了程序员阅读代码的难度,因为它破坏了代码 从上到下,顺序执行 的逻辑。


网站公告

今日签到

点亮在社区的每一天
去签到