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
,但您可以定义标签并在标签上留一个循环。 您可以使用break
或continue
然后使用标签。 所以你可以跳出多个循环级别。 看一下教程 。
不,谢天谢地,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
一些用法,即能够break
并continue
命名循环。 而且, 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; } }