Java中是否有goto语句?

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

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

Java关键字列表指定goto关键字,但它被标记为“未使用”。

它是在原始的JVM中(见@VitaliiFedorenko的回答 ),但随后删除了。 它可能保留为保留关键字,以防它被添加到更高版本的Java中。

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

防止人们被迅猛龙杀死。

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

资料来源: James Gosling,问答环节

关键字存在,但未实现。

我能想到的唯一使用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; } } 

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

“保留关键字const和goto,即使它们目前尚未使用。”

因此,如果语言设计者感到需要,他们可以在某一天使用。

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

或者也许只是为了阻止程序员使用goto 🙂

它们保留供将来使用(请参阅: Java语言关键字 )

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

Java中没有goto语句的原因可以在“ Java语言环境 ”中找到:

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

如何在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 

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

现在,虽然C语言相当低级,但它可以被认为是非常高级的汇编语言–C中的每个语句和函数都可以很容易地分解为汇编语言指令。 虽然C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。 因为C的函数如此密切地反映了汇编语言的function,所以只有goto包含在C中才有意义。

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

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

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

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

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

因为它不受支持,为什么你想要一个什么都不做的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"); } } 

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

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

尽管Java没有goto ,但它有一些构造对应于goto一些用法,即能够breakcontinue命名循环。 而且, finally可以被认为是一种扭曲的goto

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

例如, int i = 0, goto;

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

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

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

请注意,您可以替换goto的大部分良性用法

  • 返回

  • 打破

  • 打破标签

  • 扔进了try-catch-finally

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

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

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

我也不是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代码更具可读性,不是吗?

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

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

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

goto不是Java

你必须使用GOTO但它无法正常工作。在密钥java字中它没有被使用。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

  public static void main(String[] args) { GOTO me; //code; me: //code; } }