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
没有被使用,但是你可以定义标签并且留下一个循环到标签。 您可以使用break
或continue
标签。 所以你可以跳出多个循环级别。 看看这个教程 。
重要的是要明白, 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在字节码级别有goto
和goto_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;
语句来有效地执行goto
function。 但我不会推荐它。
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
一些用法相对应的构造,即能够break
并continue
命名循环。 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; } }