我对此感到困惑。我们大多数人都被告知Java中没有任何goto语句。
但我发现它是Java中的关键字之一。哪里可以使用?如果它不能使用,那么为什么它作为关键字包含在Java中?
答案 0 :(得分:215)
James Gosling在支持goto
语句的情况下创建了原始JVM,但随后他将此功能删除为不必要的。 goto
不必要的主要原因是它通常可以用更易读的语句(如break/continue
)替换,或者通过将一段代码提取到方法中来实现。
答案 1 :(得分:187)
Java keyword list指定goto
关键字,但标记为“未使用”。
它位于原始JVM中(请参阅answer by @VitaliiFedorenko),但随后被删除。它可能保留为保留关键字,以防它被添加到更高版本的Java中。
如果列表中没有goto
,并且稍后会将其添加到该语言中,则使用单词goto
作为标识符的现有代码(变量名,方法名等等) )会打破。但是因为goto
是一个关键字,这样的代码甚至不会在当前编译,并且它仍然可以在以后实际执行某些操作,而不会破坏现有代码。
答案 2 :(得分:144)
关键字存在,但未实现。
我能想到的唯一使用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;
}
}
答案 3 :(得分:43)
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
“关键字const和goto是 保留,即使他们不是 目前使用。 “
答案 4 :(得分:29)
因此,如果语言设计者认为有需要,可以使用它们。
此外,如果来自具有这些关键字的语言(例如C,C ++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误消息。
或许这只是为了阻止程序员使用goto:)
答案 5 :(得分:19)
它们保留供将来使用(请参阅:Java Language Keywords)
关键字const和goto是保留的,即使它们当前未被使用。
为什么在Java中没有goto语句的原因可以在“The Java Language Environment”中找到:
Java没有goto语句。研究表明,goto(错误)的使用频率高于“因为它存在”。消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则。对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。如上所述,多级中断并继续删除对goto语句的大部分需求。
答案 6 :(得分:17)
如何在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
答案 7 :(得分:10)
重要的是要理解goto
构造是程序员用机器代码和汇编语言编程的日子里的残余。因为这些语言是如此基本(例如,每个指令只做一个事物),程序控制流程完全用goto
语句完成(但在汇编语言中,这些被称为< i>跳或分支指令)。
现在,尽管C语言相当低级,但它可以被认为是非常高级的汇编语言 - C语言中的每个语句和函数都可以轻松地分解为汇编语言指令。尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。因为C的函数与汇编语言的函数非常接近,所以只有goto
包含在C中才有意义。
很明显,Java是C / C ++的演变。 Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写。 Java是一种非常高级的语言,因此当更多高级构造(如函数),for,for循环以及while循环执行程序控制流时,没有必要使用goto
之类的低级功能。想象一下,如果你在一个函数中并且将goto
标签转换为另一个函数。当其他函数返回时会发生什么?这个想法很荒谬。
这并不一定能解释为什么Java包含goto
语句但不会让它编译,但重要的是要知道为什么goto
首先被使用,在较低级别应用程序,以及为什么在Java中使用它没有意义。
答案 8 :(得分:10)
不,goto
未使用,但您可以定义标签并在标签上留一个循环。您可以使用break
或continue
,然后使用标签。所以你可以跳出多个循环级别。看看the tutorial。
答案 9 :(得分:9)
不,谢天谢地,Java中没有goto
。
goto
关键字仅保留,但未使用(const
也是如此)。
答案 10 :(得分:8)
因为它不受支持,为什么你想要一个没有做任何事情的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");
}
}
答案 11 :(得分:7)
不,goto
在Java中没有使用,尽管它是一个保留字。 const
也是如此。这两个都用在C ++中,这可能是它们被保留的原因;其目的可能是避免混淆C ++程序员迁移到Java,也可能保留在Java的后续版本中使用它们的选项。
答案 12 :(得分:2)
正如所指出的那样,Java中没有goto
,但是如果Sun想要有一天将goto
添加到Java中,则保留关键字。他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。请注意,在Java 5中,他们添加了enum
关键字,并且它也没有破坏那么多代码。
虽然Java没有goto
,但它有一些与goto
的一些用法相对应的构造,即能够break
和continue
具有命名循环。此外,finally
可以被视为一种扭曲的goto
。
答案 13 :(得分:2)
请注意,您可以通过
替换goto的大部分良性用法返回
断裂
打破标签
扔进了try-catch-finally
答案 14 :(得分:1)
禁止声明具有相同名称的变量。
e.g。
int i = 0, goto;
答案 15 :(得分:1)
我也不是goto
的粉丝,因为它通常会降低代码的可读性。但是我确实认为该规则有例外(特别是当涉及词法分析器和解析器时!)
当然,您可以将程序转换为类似汇编程序的程序,然后编写类似
的程序,将程序带入Kleene Normalformint 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
的代码更具可读性,不是吗?
答案 16 :(得分:1)
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
如果您被告知Java中没有goto语句,那么您就被愚弄了。实际上,Java包含两层“源”代码。
答案 17 :(得分:1)
它被认为是你不做的事情之一,但可能被列为保留字以避免混淆开发人员。
答案 18 :(得分:1)
请参阅以下链接显示所有java保留字,并告诉您它们添加的版本。
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto是保留的,即使它当前没有使用,也绝不会说永远不会:)
答案 19 :(得分:0)
因为虽然Java语言不使用它,但JVM字节码可以使用它。
答案 20 :(得分:0)
当然它是关键字,但它不用于源代码级别。
但是如果你使用jasmin或其他低级语言,转换为字节码,那么“goto”就在那里
答案 21 :(得分:-2)
是可以的,但不如c#好(我认为c#更好!)。 goto总是模糊软件的观点是愚蠢而愚蠢的!令人遗憾的是,java至少没有goto case xxx。
跳转到前进
public static void main(String [] args) {
myblock: {
System.out.println("Hello");
if (some_condition)
break myblock;
System.out.println("Nice day");
}
// here code continue after performing break myblock
System.out.println("And work");
}
后退:
public static void main(String [] args) {
mystart: //here code continue after performing continue mystart
do {
System.out.println("Hello");
if (some_condition)
continue mystart;
System.out.println("Nice day");
} while (false);
System.out.println("And work");
}