语法 - Java中是否有goto语句?
我对此感到困惑。 我们大多数人都被告知Java中没有任何goto语句。
但我发现它是Java中的关键词之一。 哪里可以使用? 如果它不能使用,那么为什么它作为关键字包含在Java中呢?
23个解决方案
222 votes
防止人们被迅猛龙杀死。
Alceu Costa answered 2019-02-28T00:14:45Z
210 votes
James Gosling在支持goto语句的情况下创建了原始JVM,但随后他将此功能删除为不必要的。 goto不必要的主要原因是通常可以用更易读的语句(如break/continue)或通过将一段代码提取到方法中来替换它。
资料来源:James Gosling,Q& A会议
Vitalii Fedorenko answered 2019-02-28T00:15:18Z
178 votes
Java关键字列表指定goto关键字,但标记为“未使用”。
它是在原始的JVM中(见@VitaliiFedorenko的回答),但随后删除了。 它可能保留为保留关键字,以防它被添加到更高版本的Java中。
如果列表中没有goto,并且稍后会将其添加到该语言中,则使用单词goto作为标识符(变量名,方法名等等)的现有代码将会中断。 但是因为goto是一个关键字,这样的代码甚至不会在当前编译,并且仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码。
Thomas answered 2019-02-28T00:14:20Z
137 votes
关键字存在,但未实现。
我能想到的唯一使用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;
}
}
jonnystoten answered 2019-02-28T00:15:57Z
43 votes
[http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]
“关键字const和goto是 保留,即使他们不是 目前使用。“
Isaac E answered 2019-02-28T00:16:29Z
28 votes
因此,如果语言设计者感到需要,他们可以在某一天使用。
此外,如果来自具有这些关键字的语言(例如C,C ++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误消息。
或者也许只是为了阻止程序员使用goto :)
dave answered 2019-02-28T00:17:09Z
19 votes
它们保留供将来使用(请参阅:Java语言关键字)
关键字const和goto是保留的,即使它们当前未被使用。
Java中没有goto语句的原因可以在“Java语言环境”中找到:
Java没有goto语句。 研究表明,goto(错误)的使用频率高于“因为它存在”。 消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则。 对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。 如上所述,多级中断并继续删除对goto语句的大部分需求。
Heinzi answered 2019-02-28T00:17:57Z
17 votes
如何在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
andrew answered 2019-02-28T00:18:24Z
10 votes
重要的是要理解goto构造是程序员用机器代码和汇编语言编程的日子。 因为这些语言是如此基本(例如,每个指令只做一件事),程序控制流程完全用goto语句完成(但在汇编语言中,这些被称为跳转或分支指令)。
现在,虽然C语言相当低级,但它可以被认为是非常高级的汇编语言 - C中的每个语句和函数都可以很容易地分解为汇编语言指令。 尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。 因为C的函数如此紧密地反映了汇编语言的功能,所以只有goto包含在C中才有意义。
很明显,Java是C / C ++的演变。 Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写。 Java是一种非常高级的语言,因此当更多高级结构(如函数,for,for和while循环)执行程序控制流时,它不需要像goto那样具有低级功能。 想象一下,如果你在一个函数中,并将goto标记到另一个函数中。 当其他函数返回时会发生什么? 这个想法很荒谬。
这并不一定能解释为什么Java包含goto语句但不会让它编译,但重要的是要知道为什么goto首先被用在较低级别的应用程序中,以及为什么它只是没有意义 在Java中使用。
Michael P at NCSU answered 2019-02-28T00:19:13Z
10 votes
不,goto未使用,但您可以定义标签并将循环保留到标签。 您可以使用break或continue,后跟标签。 所以你可以跳出多个循环级别。 看看教程。
Arne Burmeister answered 2019-02-28T00:19:40Z
8 votes
不,谢天谢地,Java中没有goto。
goto关键字仅保留,但未使用(const也是如此)。
Bozho answered 2019-02-28T00:20:14Z
7 votes
因为它不受支持,为什么你想要一个什么都不做的break label;关键字或一个名为continue label;的变量?
虽然您可以使用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");
}
}
pjp answered 2019-02-28T00:20:51Z
6 votes
不,goto在Java中没有使用,尽管它是一个保留字。 对于const也是如此。这两个都在C ++中使用,这可能是它们被保留的原因; 其目的可能是避免让迁移到Java的C ++程序员感到困惑,也许还要保留在Java的后续版本中使用它们的选项。
Michael Borgwardt answered 2019-02-28T00:21:19Z
2 votes
正如所指出的那样,Java中没有goto,但关键字是保留的,以防Sun感觉有一天会向Java添加goto。 他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。 请注意,在Java 5中,他们添加了goto关键字,并且它也没有破坏那么多代码。
虽然Java没有goto,但它有一些构造对应于goto的一些用法,即能够break和continue具有命名循环。 另外,finally可以被认为是一种扭曲的goto。
Thomas Pornin answered 2019-02-28T00:21:59Z
1 votes
禁止声明具有相同名称的变量。
例如int i = 0, goto;
Karl answered 2019-02-28T00:22:36Z
1 votes
它被认为是你不做的事情之一,但可能被列为保留字,以避免混淆开发人员。
Dean J answered 2019-02-28T00:23:07Z
1 votes
[http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto]
如果你被告知Java中没有goto语句你就被愚弄了。 实际上,Java包含两层“源”代码。
Mikael Lindlöf answered 2019-02-28T00:23:44Z
1 votes
请注意,您可以替换goto的大部分良性用法
返回
打破
打破标签
扔进了try-catch-finally
starblue answered 2019-02-28T00:24:36Z
1 votes
请参阅以下链接,显示所有java保留字,并告诉您它们添加的版本。
[http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]
goto是保留的,即使它当前没有使用,也绝不会说永远不会:)
Paul Whelan answered 2019-02-28T00:25:21Z
1 votes
我也不是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 ...其中goto对应于指令指针)
这比使用goto的代码更具可读性,不是吗?
Viktor Engelmann answered 2019-02-28T00:26:12Z
0 votes
因为虽然Java语言不使用它,但JVM字节码可以。
gribnit answered 2019-02-28T00:26:43Z
0 votes
当然它是关键字,但它不用于源代码级别。
但是如果你使用jasmin或其他低级语言,它转换为字节码,那么“goto”就在那里
user1722245 answered 2019-02-28T00:27:21Z
-3 votes
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;
}
}
m-tech answered 2019-02-28T00:27:58Z