Java中被搁置的“goto”保留字

goto语句一直被人所诟病,说它使得代码结构复杂化,但是语言设计者们还是没有放弃goto这个功能强大的语句。Java以面向对象所著称也没能够放弃goto,而是把它当做保留字,但是并未在语言中得到正式使用。

然而,从Java的break和continue这两个关键字的身上,我们依然能够看出一些goto的影子。

下面是《Thinking In Java 4th》中关于“goto”的介绍:

臭名昭著的“goto”

goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就会发现程序控制里包含了许多
跳转。然而,goto 是在源码的级别跳转的,所以招致了不好的声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着Edsger Dijkstra 著名的“Goto 有害”论的问世,goto 便从此
失宠。

事实上,真正的问题并不在于使用goto,而在于goto 的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。

尽管goto 仍是Java 的一个保留字,但并未在语言中得到正式使用;Java 没有goto。然而,在break 和continue 这两个关键字的身上,我们仍然能看出一些goto 的影子。它并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入goto 问题中一起讨论,是由于它们使用了相同的机制:标签。

Java中的标签

“标签”是后面跟一个冒号的标识符,就象下面这样:
label1:

对Java 来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另
一个循环或者一个开关。这是由于break 和continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示:

label1:
外部循环{
内部循环{
//...
break; //1
//...
continue; //2
//...
continue label1; //3
//...
break label1; //4
}
}

在条件1 中,break 中断内部循环,并在外部循环结束。在条件2 中,continue 移回内部循环的起始处。但在条件3 中,continue label1 却同时中断内部循环以及外部循环,并移至label1 处。随后,它实际是继续循环,但却从外部循环开始。在条件4 中,break label1 也会中断所有循环,并回到label1 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。

代码测试(java)

一下代码均已在jdk1.6版本中测试通过

break语句测试

public static void testLabel()
{
    for (int i = 0; i < 2; i++) {
        System.out.println("L1----"+i);
        for (int j = 0; j < 4; j++) {
            if (j == 2) {
                break;
            }
            System.out.println("--------L2---"+j);
        }
    }
}

执行结果:

L1----0
--------L2---0
--------L2---1
L1----1
--------L2---0
--------L2---1

这个代码中break直接中断内部的for循环。

break+label语句测试

public static void testLabel3()
{
label1:
    for (int i = 0; i < 2; i++) {
        System.out.println("L1----"+i);
        for (int j = 0; j < 4; j++) {
            if (j == 2) {
                break label1;
            }
            System.out.println("--------L2---"+j);
        }
    }
}

执行结果:

L1----0
--------L2---0
--------L2---1

在这个代码中break中断标签label1处的外部for循环。

continue语句测试

public static void testLabel2() {
        for (int i = 0; i < 2; i++) {
            System.out.println("L1----"+i);
            for (int j = 0; j < 4; j++) {
                if (j == 2) {
                    continue;
                }
                System.out.println("--------L2---"+j);
            }
        }
    }

执行结果:

L1----0
--------L2---0
--------L2---1
--------L2---3
L1----1
--------L2---0
--------L2---1
--------L2---3

在这个代码中continue中断掉内部的for循环后继续执行内部for循环。

continue+label语句测试

public static void testLabel4()
{
label1:
    for (int i = 0; i < 2; i++) {
        System.out.println("L1----"+i);
        for (int j = 0; j < 4; j++) {
            if (j == 2) {
                continue label1;
            }
            System.out.println("--------L2---"+j);
        }
    }
}

执行结果:

L1----0
--------L2---0
--------L2---1
L1----1
--------L2---0
--------L2---1

在这个代码中continue中断掉内部的for循环后继续执行跳到标签label1处的外部for循环,继续执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容