在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程序设计的一种技巧,需要加以掌握。

相关文章
|
2月前
|
Java
Java周期循环的代码可以如此简单
Java周期循环的代码可以如此简单
29 2
|
4月前
|
Java
Java中for循环的六种形态
Java中for循环的六种形态
23 0
|
5月前
|
Java C语言
Java选择与循环
Java选择与循环
36 0
|
5月前
|
算法 Java
7.Java判断和循环+面试相关力扣算法题详解
7.Java判断和循环+面试相关力扣算法题详解
131 1
|
5月前
|
Java
8.Java循环高级综合练习-无限循环和跳转控制语句,逢七过,平方根,判断是否为质数,猜数字小游戏
8.Java循环高级综合练习-无限循环和跳转控制语句,逢七过,平方根,判断是否为质数,猜数字小游戏
80 1
|
17天前
|
Java
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
【4月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
29 1
滚雪球学Java(17):探索循环控制:JavaSE中的break与continue秘技
|
8天前
|
安全 Java
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
|
2月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
95 3
|
2月前
|
Java
java使用循环案例—
java使用循环案例—
9 0
|
2月前
|
Java 开发者 Spring
【Java】Spring循环依赖:原因与解决方法
【Java】Spring循环依赖:原因与解决方法
46 0