📜  Java是否支持goto

📅  最后修改于: 2020-03-18 12:16:26             🧑  作者: Mango

Java不支持goto,但是goto被保留作为关键字,以防他们想将其添加到更高版本中。

  • 与C/C++不同,Java没有goto语句,但是Java支持标签label
  • 标签label在Java中唯一有用的地方就是嵌套循环语句之前。
  • 我们可以使用break指定标签label名称,以打破特定的外部循环。
  • 同样,可以使用continue指定标签label名称。

在Java中使用带有标签label的中断

// Java程序,展示使用label和break来代替goto
// 文件名: Main.java
public class Main {
    public static void main(String[] args)
    {
    // label用作外部循环
    outer:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (j == 1)
                    break outer;
                System.out.println("j = " + j);
            }
        } // 外部循环结束
    } // end of main()
} // Main类的结束

输出:

j = 0

在Java中使用带有标签label的continue

我们也可以使用continue代替break。例如,请参见以下程序。

// Java程序,展示使用label和continue来代替goto
// 文件名: Main.java
public class Main {
    public static void main(String[] args)
    {
    // label的外部循环
    outer:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (j == 1)
                    continue outer;
                System.out.println(" value of j = " + j);
            }
        } // 外部循环结束
    } // main()方法的结束
} // Main类的结束

输出:

value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0
 value of j = 0

说明:由于continue语句跳至循环中的下一个迭代,从0到9迭代10次。因此,外部循环执行10次,内部for循环在每个外部循环中执行1次。

Java没有goto语句,因为它提供了一种以任意和非结构化方式进行分支的方法。这通常会使陷入困境的代码难以理解和维护。它还禁止某些编译器优化。但是,在一些地方,goto是用于流控制的有价值且合法的构造。例如,当您从深度嵌套的一组循环中退出时,goto很有用。为了处理这种情况,Jave定义了break语句的扩展形式。

带标签label的break语句的一般形式为:

break label;

范例1:

// Java代码
public class Label_Break1 {
    public static void main(String[] args)
    {
        boolean t = true;
    first : {
    second : {
    third : {
        System.out.println("在break之前");
        if (t) // break第二个块
            break second;
    }
        System.out.println("这部被执行");
    }
        System.out.println("第二个块之后");
    }
    }
}

输出:

在break之前
第二个块之后

例2:

// Java代码
public class Label_Break2 {
    public static void main(String[] args)
    {
    outer:
        for (int i = 0; i < 3; i++) // 标签label
        {
            System.out.print("传入 " + i + ": ");
            for (int j = 0; j < 100; j++) {
                if (j == 10) {
                    break outer; // 跳出两个循环
                }
                System.out.print(j + " ");
            }
            System.out.println("这不会被打印");
        }
        System.out.println("循环结束.");
    }
}

输出:

传入 0: 0 1 2 3 4 5 6 7 8 9 循环结束.