Java中有goto语句吗?

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

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

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

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

如果goto不在列表中,并且稍后将其添加到语言中,则使用goto作为标识符(variables名称,方法名称等)的现有代码将会中断。 但是因为goto是一个关键字,所以现在这样的代码甚至不能编译,而且在不破坏现有的代码的情况下,仍然有可能在以后做一些事情。

James Gosling创build了支持goto语句的原始JVM,但是随后他不需要这个特性。 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是保留的,即使它们目前没有使用。”

所以如果语言devise者觉得需要的话,他们可能会有一天被使用。

另外,如果程序员从具有这些关键字的语言(例如C,C ++)错误地使用它们,那么Java编译器会给出一个有用的错误消息。

或者,也许这只是停止使用goto的程序员:)

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

关键字const和goto是保留的,即使它们目前没有使用。

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

Java没有goto语句。 研究表明,goto被(mis)使用的次数往往不是简单的“因为它在那里”。 消除goto导致了语言的简化 – 例如,没有关于goto到for语句中间的影响的规则。 对大约100000行C代码的研究确定,大约百分之九十的goto语句纯粹用于获得突破嵌套循环的效果。 如上所述,多级中断并继续删除大部分对goto语句的需求。

Java中如何使用“继续”标签的例子是:

 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没有被使用,但是你可以定义标签并且留下一个循环到标签。 您可以使用breakcontinue标签。 所以你可以跳出多个循环级别。 看看这个教程 。

重要的是要明白, goto构造是程序员用机器代码和汇编语言编程的日子。 由于这些语言是如此基本(因为每条指令只做一件事情),程序控制stream程完全用goto语句完成(但汇编语言中,这些语句被称为跳转分支指令)。

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

很明显,Java是C / C ++的演变。 Java从C中分享了许多特性,但是抽象出更多的细节,因此简单地写成了不同的东西。 Java是一种非常高级的语言,所以当更多的高层次的结构(比如函数,while,while和while循环)执行程序控制stream程时,不需要像goto这样的低级特性。 想象一下,如果你在一个function,并做了一个标签到另一个function。 当其他函数返回时会发生什么? 这个想法是荒谬的。

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

Java在字节码级别有gotogoto_w 。 但是,在Java语言中没有GOTO。

虽然Java禁止GOTO,但微软决定将其保留在.NET库中。 C#确实允许GOTO:

转到(C#参考)

goto语句将程序控件直接转换为带标签的语句。 goto的一个常见用途是将控制权转移到特定的switch-case标签或switch语句中的默认标签。 goto语句对于深度嵌套循环也是有用的。

鉴于C#(Java在.NET中的主要竞争对手)允许GOTO,我不明白为什么Java也有这么大的作用。

有一些解决方法,比如这个项目:

JavaGoto

它在转换遗留代码时派上用场。 例如,一些遗留的Fortran代码太复杂,以至于在将代码迁移到正确的构造之前,保持GOTO完好可能是最有效的解决scheme。

C#中Goto的限制并没有导致GOTO的滥用,我怀疑如果Java允许的话,Java会更糟糕。

因为它不被支持,你为什么要一个goto关键字什么都不做或者一个名为goto的variables?

虽然你可以使用break label;continue label; 语句来有效地执行gotofunction。 但我不会推荐它。

 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"); } } 

不,谢天谢地,Java没有goto

goto关键字只保留,但不使用( const )。

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

正如所指出的那样,Java中没有goto ,但是关键字被保留了,以至于Sun有一天感觉像是将Java添加到了Java中。 他们希望能够添加它,而不会破坏太多的代码,所以他们保留关键字。 请注意,在Java 5中,他们添加了enum关键字,并没有破坏那么多的代码。

虽然Java没有goto ,但它有一些与goto一些用法相对应的构造,即能够breakcontinue命名循环。 finally还可以想象成一种扭曲的goto

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

如果您被告知在Java中没有goto语句,您就被愚弄了。 事实上,Java由两层“源代码”组成。

我也不喜欢goto ,因为它通常会使代码不易读。 不过,我相信这个规则也有例外(特别是在词法分析器和parsing器方面)!

当然,你总是可以把你的程序变成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; } } 

(所以你基本上写一个虚拟机执行你的二进制代码…哪里line对应的指令指针)

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

禁止同名variables的声明。

例如int i = 0, goto;

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

因为尽pipeJava语言没有使用它,但是JVM字节码却可以。

请注意,您可以取代goto的大部分良性用途

  • 返回

  • 打破

  • 打破标签

  • 扔在try-catch-finally里面

看下面的链接是显示所有的java保留字,并告诉你他们添加哪些版本。

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

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

当然这是关键字,但是它并没有在源代码的层面上使用。

但是如果你使用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; } }