Java中是否有goto语句?

时间:2010-03-30 12:30:27

标签: java syntax keyword goto

我对此感到困惑。我们大多数人都被告知Java中没有任何goto语句。

但我发现它是Java中的关键字之一。哪里可以使用?如果它不能使用,那么为什么它作为关键字包含在Java中?

22 个答案:

答案 0 :(得分:215)

James Gosling在支持goto语句的情况下创建了原始JVM,但随后他将此功能删除为不必要的。 goto不必要的主要原因是它通常可以用更易读的语句(如break/continue)替换,或者通过将一段代码提取到方法中来实现。

来源:James Gosling, Q&A session

答案 1 :(得分:187)

Java keyword list指定goto关键字,但标记为“未使用”。

它位于原始JVM中(请参阅answer by @VitaliiFedorenko),但随后被删除。它可能保留为保留关键字,以防它被添加到更高版本的Java中。

如果列表中没有goto,并且稍后会将其添加到该语言中,则使用单词goto作为标识符的现有代码(变量名,方法名等等) )会打破。但是因为goto是一个关键字,这样的代码甚至不会在当前编译,并且它仍然可以在以后实际执行某些操作,而不会破坏现有代码。

答案 2 :(得分:144)

关键字存在,但未实现。

我能想到的唯一使用goto的理由是:

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

在Java中你可以这样做:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}

答案 3 :(得分:43)

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

  

“关键字const和goto是   保留,即使他们不是   目前使用。 “

答案 4 :(得分:29)

因此,如果语言设计者认为有需要,可以使用它们。

此外,如果来自具有这些关键字的语言(例如C,C ++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误消息。

或许这只是为了阻止程序员使用goto:)

答案 5 :(得分:19)

它们保留供将来使用(请参阅:Java Language Keywords

  

关键字const和goto是保留的,即使它们当前未被使用。

为什么在Java中没有goto语句的原因可以在“The Java Language Environment”中找到:

  

Java没有goto语句。研究表明,goto(错误)的使用频率高于“因为它存在”。消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则。对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。如上所述,多级中断并继续删除对goto语句的大部分需求。

答案 6 :(得分:17)

如何在Java中使用“continue”标签的示例是:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

结果:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1

答案 7 :(得分:10)

重要的是要理解goto构造是程序员用机器代码和汇编语言编程的日子里的残余。因为这些语言是如此基本(例如,每个指令只做一个事物),程序控制流程完全用goto语句完成(但在汇编语言中,这些被称为< i>跳或分支指令)。

现在,尽管C语言相当低级,但它可以被认为是非常高级的汇编语言 - C语言中的每个语句和函数都可以轻松地分解为汇编语言指令。尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。因为C的函数与汇编语言的函数非常接近,所以只有goto包含在C中才有意义。

很明显,Java是C / C ++的演变。 Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写。 Java是一种非常高级的语言,因此当更多高级构造(如函数),for,for循环以及while循环执行程序控制流时,没有必要使用goto之类的低级功能。想象一下,如果你在一个函数中并且将goto标签转换为另一个函数。当其他函数返回时会发生什么?这个想法很荒谬。

这并不一定能解释为什么Java包含goto语句但不会让它编译,但重要的是要知道为什么goto首先被使用,在较低级别应用程序,以及为什么在Java中使用它没有意义。

答案 8 :(得分:10)

不,goto未使用,但您可以定义标签并在标签上留一个循环。您可以使用breakcontinue,然后使用标签。所以你可以跳出多个循环级别。看看the tutorial

答案 9 :(得分:9)

不,谢天谢地,Java中没有goto

goto关键字仅保留,但未使用(const也是如此)。

答案 10 :(得分:8)

因为它不受支持,为什么你想要一个没有做任何事情的goto关键字或一个名为goto的变量?

虽然您可以使用break label;continue label;语句来有效地执行goto所做的事情。 但我不推荐它。

public static void main(String [] args) {

     boolean t = true;

     first: {
        second: {
           third: {
               System.out.println("Before the break");

               if (t) {
                  break second;
               }

               System.out.println("Not executed");
           }

           System.out.println("Not executed - end of second block");
        }

        System.out.println("End of third block");
     }
}

答案 11 :(得分:7)

不,goto在Java中没有使用,尽管它是一个保留字。 const也是如此。这两个都用在C ++中,这可能是它们被保留的原因;其目的可能是避免混淆C ++程序员迁移到Java,也可能保留在Java的后续版本中使用它们的选项。

答案 12 :(得分:2)

正如所指出的那样,Java中没有goto,但是如果Sun想要有一天将goto添加到Java中,则保留关键字。他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。请注意,在Java 5中,他们添加了enum关键字,并且它也没有破坏那么多代码。

虽然Java没有goto,但它有一些与goto的一些用法相对应的构造,即能够breakcontinue具有命名循环。此外,finally可以被视为一种扭曲的goto

答案 13 :(得分:2)

请注意,您可以通过

替换goto的大部分良性用法
  • 返回

  • 断裂

  • 打破标签

  • 扔进了try-catch-finally

答案 14 :(得分:1)

禁止声明具有相同名称的变量。

e.g。 int i = 0, goto;

答案 15 :(得分:1)

我也不是goto的粉丝,因为它通常会降低代码的可读性。但是我确实认为该规则有例外(特别是当涉及词法分析器和解析器时!)

当然,您可以将程序转换为类似汇编程序的程序,然后编写类似

的程序,将程序带入Kleene Normalform
int line = 1;
boolean running = true;
while(running)
{
    switch(line++)
    {
        case 1: /* line 1 */
                break;
        case 2: /* line 2 */
                break;
        ...
        case 42: line = 1337; // goto 1337
                break;
        ...
        default: running = false;
                break;
    }
}

(所以你基本上写了一个执行你的二进制代码的VM ......其中line对应于指令指针)

这比使用goto的代码更具可读性,不是吗?

答案 16 :(得分:1)

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto

如果您被告知Java中没有goto语句,那么您就被愚弄了。实际上,Java包含两层“源”代码。

答案 17 :(得分:1)

它被认为是你不做的事情之一,但可能被列为保留字以避免混淆开发人员。

答案 18 :(得分:1)

请参阅以下链接显示所有java保留字,并告诉您它们添加的版本。

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

goto是保留的,即使它当前没有使用,也绝不会说永远不会:)

答案 19 :(得分:0)

因为虽然Java语言不使用它,但JVM字节码可以使用它。

答案 20 :(得分:0)

当然它是关键字,但它不用于源代码级别。

但是如果你使用jasmin或其他低级语言,转换为字节码,那么“goto”就在那里

答案 21 :(得分:-2)

是可以的,但不如c#好(我认为c#更好!)。 goto总是模糊软件的观点是愚蠢而愚蠢的!令人遗憾的是,java至少没有goto case xxx。

跳转到前进

 public static void main(String [] args) {
   myblock: {
     System.out.println("Hello");
     if (some_condition)
       break myblock; 
     System.out.println("Nice day");
   }
   // here code continue after performing break myblock
   System.out.println("And work");
 }

后退:

 public static void main(String [] args) {
   mystart: //here code continue after performing continue mystart
   do {
     System.out.println("Hello");
     if (some_condition)         
       continue mystart; 
     System.out.println("Nice day");
   } while (false);
   System.out.println("And work");
 }