goto
編程語言中一開始就有goto關鍵詞了。事實上,goto起源於彙編語言的進程控制:“若條件A成立,則調到這裏;否則跳到那裏”。
goto語句時在源碼級別上的跳轉,這導致了其不好的名譽。於是goto開始保留使用。
儘管goto仍然是Java中的一個保留字,但在語句中並未使用它:Java沒有goto。然而Java也能完成一些類似跳轉的操作,這與break和continue這兩個關鍵詞有關。它們起始不是一個跳轉,而是中斷迭代語句的一種方法。之所以把它們納入goto問題中一起討論,是由於它們使用了相同的機制:標籤。
標籤是後面跟有冒號的標識符,就像下面這樣:
label1:
在Java中,標籤其作用的唯一的地方剛好是在迭代語句之前。“剛好之前”的意思表明,在標籤和迭代之間置入任何語句都不好。而在迭代之前設置標籤的唯一理由是:我們希望在其中嵌套另一個迭代或者一個開關。這是由於break和continue關鍵字通常只能中斷當前循環,但若索通標籤一起使用,它們就會中斷循環,知道標籤所在的地方。
label1:
outer-ieration {
inner-iteration{
//...
break; //(1)
//...
continue;//(2)
//...
continue label1;//(3)
//...
break label1; //(4)
}
}
在(1)中,break中斷內部迭代,回到外部迭代。在(2)中,continue使執行點移回內部迭代的起始處。在(3)中,continue label1同時中斷內部迭代以及外部迭代,直接轉到label1處;隨後它實際上時繼續迭代過程,但卻從外部迭代開始。在(4)中,break label1也會中斷所有迭代,並回到label1處,但並不重新進入迭代。也就是説,它實際上是完全終止了兩個迭代
public static void main(String[] args){
int i = 0;
outer: //這裏不能有任何語句
for (;true;){
inner: //這裏不能有任何語句
for (; i < 10; i++){
System.out.println("i = " + i);
if(i == 2) {
System.out.println("continue");
continue;
}
if(i == 3) {
System.out.println("break");
i++;
break;
}
if(i == 7) {
System.out.println("continue outer");
i++;
continue outer;
}
if(i == 8){
System.out.println("break outer");
break outer;
}

for(int k = 0; k < 5; k++){
if(k == 3){
System.out.println("continue inner");
continue inner;
}
}
}
}
}
輸出信息:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
注意,break會中斷for循環,而且在抵達for循環的末尾之前,遞增表達式不會執行。由於break跳過了遞增表達式,所以在i==3的情況下直接對i執行遞增操作。在i==7的情況下,continue outer語句會調到循環頂部,而且也會跳過遞增,所以這裏也對i進行遞增。
如果沒有break outer語句,就沒辦法從內部循環裏跳出外部循環。這是由於break本身只能中斷最內層的循環(continue亦是如此)
當然,如果想在中斷循環的同時推出,簡單地使用一個return即可。
public static void main(String[] args){
int i = 0;
outer:
while(true){
System.out.println("Outer while loop");
while(true){
i++;
System.out.println("i = " + i);
if(i == 1) {
System.out.println("continue");
continue;
}
if(i == 3) {
System.out.println("continue outer");
continue outer;
}
if(i == 5){
System.out.println("break");
break;
}
if(i == 7){
System.out.println("break outer");
break outer;
}
}
}
}
輸出信息:
Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer
同樣的規則亦適用於while:
1、一般的continue會退回最內層循環的開頭,並繼續執行
2、帶標籤的continue會到達標籤的位置,並重新進入緊接在那個標籤後面的循環
3、一般的break會中斷並跳出當前循環
4、帶比起噢愛按的break會中斷並跳出標籤所指的循環
要注意的要點是:在Java裏需要使用標籤的唯一理由就是因為有循環嵌套存在,而且想從多層嵌套中break或continue。

from: https://hk.saowen.com/a/f30ac1fd93e9a345e31bfe064ceda916f56180221412b0786b7f5467df6af367

java中break,continue,標籤實現goto效果(編程思想)相关推荐

  1. Java中 break continue return 的区别

    1.break break :跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环: for (int i = 0; i < 10; i++) { i ...

  2. Java中 break continue return 的用法以及区别

    1.return (1)return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行. (2)return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致 ...

  3. Java中return结束循环,Java中break、continue、return在for循环中的使用

    Java中break.continue.return在for循环中的使用 发布时间:2020-09-25 02:01:45 来源:脚本之家 阅读:81 作者:mrr 引言:在使用循环的时候,循环里面带 ...

  4. java中break内外循环_java 中break如何跳出外部循环

    学习就是为了不断的看到自己的知识盲点,然后改正,以前知道如何使用break来跳出循环,突然学习到可以用break跳出外部的循环(以前只知道怎么调本次的循环). 上正题代码如下: break跳出本次循环 ...

  5. Java中break、Continue、reutrn总结

    随手记录一下: (声明:部分内容总结来自以下博客的连接,侵删) https://www.cnblogs.com/yangh965/p/5854022.html https://blog.csdn.ne ...

  6. java 反向映射,如何使用lambdas實現反向映射Java?

    在這個例子中,我將這個列表累加到LinkedList. LinkedList實現了Deque(雙端隊列),它允許我以後進先出(LIFO)順序追加項目. 我使用LinkedList :: addFirs ...

  7. java中break什么意思_Java中break的第三种用法说明

    在Java中,break语句有三种用法,第一种是用于终止switch语句中的语句序列,第二种是用于退出循环,然而第三种是用作goto语句的"文明"形式! 我们知道,goto语句会破 ...

  8. Java中 break、continue 和 return三者之间的区别

    一.Java break 可以直接强行退出当前的循环,忽略循环体中任何其他语句和循环条件测试 以下实例使用了 break 关键字来跳出当前循环: public class Main {public s ...

  9. java中break和continue的用法例子

    break用于switch语句 1. break用于switch语句中,终止switch语句 下面先看 加上break,效果如下 我们可以看到,没有用过break关键字时,不会在判断下一个case的值 ...

最新文章

  1. 【73套】Epic Stock Media配乐音效素材合集包
  2. 从神经元谈到深度神经网络
  3. 密码篇——非对称加密
  4. html标题电脑快速输入,快速把纸上文字输入到电脑中的技巧
  5. rman学习笔记部分
  6. Qt字符串转日期时间-毫秒
  7. C#运算符重载(操作符重载)
  8. Spring @RequestMapping注解示例
  9. 阿里发布的规约插件,细节都在这里
  10. mysql的select复合查询语法_MySQL(九)之数据表的查询详解(SELECT语法)二
  11. 内存带宽测试与AVX指令集读写内存
  12. Android App Bundle: 最新改进和 Google Play 新应用计划
  13. 用字符数组输出平行四边形
  14. 如何合理确定线程池的大小
  15. 设计模式二:创建型-工厂模式
  16. T5 根据派生类写出基类(Java) (10分)
  17. echarts 实现横坐标只显示第一个和最后一个自定义的内容
  18. 基于xml的数据交换技术
  19. 按键精灵调用python插件_【Python 教程】使用 Python 和大漠插件进行文字识别
  20. Monsters Battle Royale(gcd)

热门文章

  1. 读阿里亿级日活网关通道架构演进有感
  2. 使用solr的DIHandler 构建mysql大表全量索引,内存溢出问题的解决方法
  3. Linux服务器集群系统(二)--转
  4. 【行业报告】信贷场景下全流程数据风控体系——宜信
  5. 2018 年度 GtiHub 开源项目 TOP 25:数据科学 机器学习
  6. Android华容道之一步一步实现-6-还原状态检测
  7. Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )
  8. Linux-使用 Find 命令找到那些需要清理的文件
  9. python 搜索二维矩阵
  10. python expect模块_成为顶级黑客--python绝技 阅读笔记(五)