在Java中如何从一个多层嵌套循环中直接跳出?

简介: 在Java中如何从一个多层嵌套循环中直接跳出?

 image.gif编辑

 

一、问题描述

最近发现一个有趣的问题,在Java中如何从一个多层嵌套循环中退出呢?

例如下面,有两层循环,break只能退出第一个for循环,不能直接跳出第二个for循环外面。

public static void main(String[] args) {
        for (String s1: sArray1) {
            for (String s2 : sArray2) {
                if (某个条件){
                    // 执行事件后退出
                    break;
                    // 这样只退出了最里的for循环
                }
            }
        }
    }

image.gif

二、解决方案

那该怎么解决这个问题呢?答案是可以用break+label的语法,例子如下:

public class test {
    public static void main(String[] args) {
        String[] s1={"1","2","3","4","5"};
        String[] s2={"6","7","8","9","10"};
        loop:for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (j > 2) {
                    System.out.println("使用break退出循环");
                    break loop;
                }
                System.out.println(i+"---"+j);
            }
        }
        System.out.println("执行结束");
    }
}

image.gif

首先在for循环前加标签,如例子中的loop,然后在for循环内break label(如本例的loop),就会跳出该label指定的for循环。

当然,这种方案小伙伴们见的比较少,我们也可以采用return的方式退出循环。

public class test {
    public static void main(String[] args) {
        String[] s1={"1","2","3","4","5"};
        String[] s2={"6","7","8","9","10"};
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (j > 2) {
                    System.out.println("使用return退出循环");
                    return;
                }
                System.out.println(i+"---"+j);
            }
        }
        System.out.println("执行结束");
    }
}

image.gif

但使用return和使用break是有区别的,return后就不会继续执行后面的代码了,而使用break只是跳出循环,后面的代码还是会继续去执行。

所以最后一段代码的执行结束部分不会被执行。

三、goto关键字

这种break的方式,其实类似于c语言中的goto语法,比如下面的代码:

#include<stdio.h>
int n=0;
int main(void) {
    printf("input a string: ");
        loop: if (getchar()!='\n') {
        n++;
        goto loop;
    }
  printf("output: %d\n",n);
}

image.gif

在C/C++中,goto常被用于跳出多重循环。但goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。在Java中,goto也是作为关键字被保留的,但这个关键字没有任何作用,只是为了将来可能的扩展,防止使用goto作为程序中的标识符。

四、Java中的标签

我们前面使用使用"break loop;"的方式跳出多重循环,实际上loop是Java的自定义自定义标签,Java 中的标签是为循环设计的,是为了在多重循环中方便的使用 break 和 coutinue 而设计的。(这也是Java中唯一用到标签的地方!)正是由于这个原因,Java 的标签只能定义在三种循环 (for() {}, do{} while(), while() {}) 的开始位置,否则编译器会报告说找不到标签。

在循环前面加上标签,就好像给循环起了个名字。而后在循环中使用 break 或者 continue 语句的时候,就可以带上这个标签做为参数,指明跳出 (break) 或者继续 (continue)标签对应的哪个循环,如"break mylabel;"、"continue mylabel;"。

五、总结

虽然break/continue+标签的用法平时很少见到,但在Java的源码中不时会看到,如在ThreadPoolExecutor类中的addWorker方法就使用了"continue 标签"。因此这也是Java程序设计的一种技巧,需要加以掌握。

相关文章
|
4天前
|
Java
Java周期循环的代码可以如此简单
Java周期循环的代码可以如此简单
33 2
|
4天前
|
Java
Java中for循环的六种形态
Java中for循环的六种形态
24 0
|
4天前
|
Java
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
【4月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
35 1
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
|
4天前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
29 2
|
1天前
|
Java
while跳出循环java - 蓝易云
在这个例子中,当 `count`变量的值大于或等于5时,`break`语句会被执行,从而结束 `while`循环。
11 3
|
4天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
10 0
|
4天前
|
Java
【JAVA基础篇教学】第三篇:Java循环控制语句
【JAVA基础篇教学】第三篇:Java循环控制语句
|
4天前
|
Java 测试技术
Java一分钟之-循环结构:for与while循环
【5月更文挑战第8天】本文探讨了Java中两种主要的循环结构——`for`和`while`循环。`for`循环适用于已知迭代次数的情况,常见问题包括无限循环、初始化错误和作用域混淆。`while`循环适用于循环次数未知但条件明确的情况,需注意更新条件、死循环初始化和逻辑错误。避免错误的策略包括明确循环目的、检查边界条件、管理迭代变量、进行代码审查和测试,以及使用增强型`for`循环。正确理解和使用这些循环能提升代码质量。
13 0
|
4天前
|
安全 Java
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
|
4天前
|
Java Maven
【亮剑】Java项目开发中常遇到Jar 包依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起
【4月更文挑战第30天】Java项目开发中常遇到依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起。解决冲突需分析依赖树、定位冲突源、调整类加载顺序等。方法包括排除冲突依赖、统一管理版本、限定依赖范围、合并冲突类、升级降级库版本及拆分模块。关注依赖关系,及时解决冲突,保障项目稳定运行。