【JAVA】Java中goto语句的简介与使用(java 如何跳出内嵌多层循环的方法)

【JAVA】Java中goto语句的简介与使用(java 如何跳出内嵌多层循环的方法)

参考链接: Java是否支持goto

1.概述

这是我在看公司代码的时候发现,居然有一个goto语句的使用,所以来学习一下

goto语句在java中作为保留字,并没有实现它。但在其他语言中(c语言),goto是个合法的关键字 java中支持的break和continue虽然能实现goto语句的功能但是我个人总结他们的用法大同小异

首先在java中对标号的要求非常严格

标号必须在一个循环的前面,意思是这个循环的名字叫outer(假设标号名为outer),并且这一行后面不能有任何语句了;

而break和continue是和循环语句结合使用的,因此实际上语句标签的使用也是和循环紧密结合的。

语句标签在被使用的情况,只能定义在循环迭代语句之前,否则编译出错

因此带标号的break、continue 只能在循环体或者选择体(if等)之中跳转

而(c语言)goto的用法则比较灵活,(c语言)中的标号可以在任意一个合法语句的前面 因此goto可以在一个函数(c语言)中任意位置跳转(当然不能违反goto语句的合理用法例如不能再嵌套之间跳转等)

因此 个人总结

带标号的break、continue局限于循环体中跳转带标号的goto 可以在整个方法中(c语言函数)跳转goto比带标号的break、continue用法灵活 正因为太灵活了,使程序的逻辑结构变的复杂,流程不够清晰,程序的可读性下降,所以java中把goto 保留了

2.案例

package com.java.keyword;

import org.junit.Test;

import static org.junit.Assert.*;

public class GoToDemoTest {

/**

* 1:0

* 1:1

* 1:2

* 1:3

* 1:4

* 2:0

* 2:1

* 3:0

* 3:1

* 3:2

* 3:3

* 3:4

* 4:0

* 4:1

* 4:2

* 4:3

* 4:4

*/

@Test

public void gotoTest(){

for (int i = 1; i <5; i++) {

for (int j = 0; j < 5; j++) {

if(i == 2 && j == 2){

break;

}else {

System.out.println(i+":"+j);

}

}

}

}

/**

* 1:0

* 1:1

* 1:2

* 1:3

* 1:4

* 2:0

* 2:1

*/

@Test

public void goto1Test(){

WAF_LOOP_ONE:

for (int i = 1; i <5; i++) {

for (int j = 0; j < 5; j++) {

if(i == 2 && j == 2){

break WAF_LOOP_ONE;

}else {

System.out.println(i+":"+j);

}

}

}

}

}

2。案例

转载:https://www.knowledgedict.com/tutorial/java-break-out-of-nested-loops.html java 如何跳出内嵌多重循环的方法主要有两种,一种是利用 Java 的 label,另一种是巧妙地将相关的循环逻辑抽出到单独的方法里,然后在循环处 return 退出,但是这种方法只限定于跳出到最外层。

1利用 java 的 label

2封装方法里 return

利用 java 的 label

outerLoop:

for (int i = 0; i < 5; i++) {

innerLoop:

for (int j = 0; j < 5; j++) {

if (i * j > 6) {

System.out.println("Breaking");

break outerLoop;

}

System.out.println(i + " " + j);

}

}

System.out.println("Done");

以上示例 2 层循环,外层 label 用 outerLoop 标记,内层 label 用 innerLoop 标记,跳出时用 break 指定要跳出到的 label 层。

封装方法里 return 将部分循环代码从主业务逻辑中抽出一个方法,然后通过 return 跳出,但这个只限定于退出到最外层。

public static void loop(...) {

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 5; j++) {

if (i * j > 6) {

System.out.println("Breaking");

return;

}

System.out.println(i + " " + j);

}

}

}

相关推荐

加油卡充值后为啥要圈存?
365体育亚洲官方登录

加油卡充值后为啥要圈存?

📅 01-03 👁️ 3262
BIO和NIO(特点、使用场景等对比)
日博365官网网址多少

BIO和NIO(特点、使用场景等对比)

📅 10-13 👁️ 4507
大镜子不打孔怎样安装在墙上
365cc彩票老版

大镜子不打孔怎样安装在墙上

📅 07-13 👁️ 4515