我对此感到困惑。我们大多数人都听说过Java中没有goto语句。
但我发现它是Java中的关键字之一。它可以在哪里使用?如果它不能使用,那么为什么它作为关键字包含在Java中?
我对此感到困惑。我们大多数人都听说过Java中没有goto语句。
但我发现它是Java中的关键字之一。它可以在哪里使用?如果它不能使用,那么为什么它作为关键字包含在Java中?
当前回答
不,谢天谢地,Java中没有goto。
goto关键字只保留,但不使用(const也是如此)。
其他回答
我也不喜欢goto,因为它通常会降低代码的可读性。然而,我相信这条规则也有例外(特别是涉及词法分析器和解析器时!)
当然,你也可以把程序转换成类似于汇编程序的形式,然后编写类似于
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的代码可读性强多了,不是吗?
关键字存在,但没有实现。
我能想到的使用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;
}
}
因为它不受支持,为什么你想要一个什么都不做的goto关键字或者一个名为goto的变量?
虽然你可以使用break标签;并继续标签;语句来有效地做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");
}
}
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
如果有人告诉你Java中没有goto语句,那你就被骗了。事实上,Java由两层“源代码”组成。
因为尽管Java语言不使用它,但JVM字节码使用它。