search.png
关于我
menu.png
Java review(13) Java有goto吗

goto不知道为什么这么讨人厌呢?我也不明白,大学时c语言老师就严厉反对我们使用goto。因此我也没怎么用过,有时候我在想这些最讨厌goto的人是不是曾经也是goto的重度使用患者,然后有一天他们的goto把他们的程序搞崩了,然后他们发现用goto写的程序他们自己也看不懂了...

咱也不敢说,也不敢问。

就说说java吧。我Java这么严谨的语言怎么可能有goto呢,当然是不可能有的。

但是我们有break goto 和 continue goto,我觉得这算是弱化版的goto,

学了Java两三年了,我还真的只是听过没有用过,可能是被goto的恶名影响了吧。

但是最近review java再度发现了这个,我觉得还是挺好用的。

首先先看一下break和continue吧:

    @Test
    public void test1() throws Exception {

        int i = 0;

        while (true) {
            i ++;
            if (i == 10) {
                System.out.println("continue i = " + i);
                continue;
            }
            if (i >= 10) {
                System.out.println("break i =" + i);
                break;
            }
        }
    }

输出:

continue i = 10
break i =11

在i == 10,先执行了continue跳过了后边的判断,然后再次进入循环,i = 11,满足break条件,跳出循环。

break goto就是为了解决以下代码中的困境的:
这样的多重循环,要怎么跳出?

    @Test
    public void test2() throws Exception {
        int i = 0;

        while (true) {
            do {
                for (;;) {
                    i ++;
                    if (i == 10) {
                        break;
                    }
                }
            } while (true);
        }
    }

我们可能会用一个标识:

    @Test
    public void test3() throws Exception {
        int i = 0;
        boolean justBreak = false;

        while (!justBreak) {
            do {
                for (;;) {
                    i ++;
                    if (i == 10) {
                        justBreak = true;
                        break;
                    }
                }
            } while (!justBreak);
        }

        System.out.println("i = " + i);
    }

其实这样也挺好的,brerak goto会更好吗?

    @Test
    public void test4() throws Exception {
        int i = 0;

        breakPoint:
        while (true) {
            do {
                for (;;) {
                    i ++;
                    if (i == 10) {
                        break breakPoint;
                    }
                }
            } while (true);
        }

        System.out.println("i = " + i);
    }

其实也不错,代码量少了写。但是可读性会差一些。

continue也是类似的用法:

    @Test
    public void test5() throws Exception {
        int i = 0;

        breakPoint:
        while (true) {
            continuePoint:
            while (true) {
                // 1
                System.out.println("continue Point从这里进入");
                while (true) {
                    if (i == 5) {
                        break breakPoint;
                    }
                    if (i++ >= 0) {
                        continue continuePoint;
                    }
                }
                // System.out.println("这里永远不会执行");
            }
        }

        System.out.println("i = " + i);
    }

注释掉的那句语句永远也执行不到。但是语句1却会执行到:

continue Point从这里进入
continue Point从这里进入
continue Point从这里进入
continue Point从这里进入
continue Point从这里进入
continue Point从这里进入
i = 5

continue label 会跳到 label指定的循环入口处执行,它相当于一个break goto,但是break goto不会再进入循环,而continue goto 会。

这么说可能还是不是很好理解,可以看一下断点:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

break continue goto 有利有弊,主要看怎么使用,但是可能你的老同事并不熟悉这种语法,他看到你用,第一反应就是想打你一顿。

唉,这该死的旧势力...

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2019年11月29日 10:56:12

评论区#

还没有评论哦,期待您的评论!

关闭特效