当前位置: 首页 > news >正文

goto在Java中的用法

说明: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 砍掉是对的,随意跳转代码执行提高了程序员阅读代码的难度,因为它破坏了代码 从上到下,顺序执行 的逻辑。

http://www.dtcms.com/a/111283.html

相关文章:

  • 架构与大数据-RabbitMQ‌和Kafka的技术实现异同及落地场景上的异同
  • 数据库相关简介
  • MINIQMT学习课程Day9
  • leetcode 代码随想录 数组-区间和
  • Cortex-M 上编写汇编函数
  • 01-STM32(介绍、工具准备、新建工程)p1-4
  • 重要头文件下的函数
  • [Python学习日记-89] 并发编程之多进程 —— 共享数据、信号量、事件、进程池
  • 【nginx】Nginx的功能特性及常用功能
  • PostgreSQL:表分区与继承
  • OBS录制的一些日志
  • python如何把列表中所有字符变成小写
  • GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议
  • 【蓝桥杯】算法笔记3
  • 函数栈帧的创建与销毁
  • 言语理解与表达
  • 实战交易策略 篇十四:江南神鹰捕捉热点和熊市生存交易策略
  • 专为 零基础初学者 设计的最简前端学习路线,聚焦核心内容,避免过度扩展,帮你快速入门并建立信心!
  • 第15周:注意力汇聚:Nadaraya-Watson 核回归
  • 生成 SSH Key 并配置 GitHub/GitLab 详细教程
  • 深入理解AOP:面向切面编程的核心概念与实战应用
  • ctfshow VIP题目限免 robots后台泄露
  • 规则引擎Drools
  • 【KMP】P10915 [蓝桥杯 2024 国 B] 最长回文前后缀|普及+
  • RHCSA Linux 系统 文件的查看、复制、移动、重命名
  • 阿里巴巴langengine二次开发大模型平台
  • 压测工具开发实战篇(二)——构建侧边栏以及设置图标字体
  • Linux(十二)信号
  • SQL注入重新学习
  • OpenEuler/CentOS一键部署OpenGauss数据库教程(脚本+视频)