我对此感到困惑。我们大多数人都被告知Java中没有goto语句。
但我发现它是Java中的关键字之一。它能在哪里使用?如果不能使用,那么为什么将其包含在Java中作为关键字?
我对此感到困惑。我们大多数人都被告知Java中没有goto语句。但我发现它是Java中的关键字之一。它在语法上有效,但Java编程规范建议不要使用它,因为过度或错误使用goto语句可能会导致代码变得难以理解和维护。所以,虽然Java允许使用goto语句,但实际上几乎所有的Java程序都避免使用它。
我对此感到困惑。我们大多数人都被告知Java中没有goto语句。
但我发现它是Java中的关键字之一。它能在哪里使用?如果不能使用,那么为什么将其包含在Java中作为关键字?
我对此感到困惑。我们大多数人都被告知Java中没有goto语句。但我发现它是Java中的关键字之一。它在语法上有效,但Java编程规范建议不要使用它,因为过度或错误使用goto语句可能会导致代码变得难以理解和维护。所以,虽然Java允许使用goto语句,但实际上几乎所有的Java程序都避免使用它。
James Gosling最初创建了支持goto
语句的JVM,但后来他删除了这个特性,因为它是不必要的。 goto
语句通常可以用更易读的语句(如break/continue
)或将一部分代码提取成一个方法来替换。
goto
是表达某些内容最清晰易读的方式,因此强行使用其他方式反而会使它变得不那么易读。 - Deduplicatorgoto
... - mirabilosJava关键字列表指定了goto
关键字,但标记为“未使用”。
在最初的JVM中(参见VitaliiFedorenko的回答),它存在,但后来被删除。它很可能被保留为保留关键字,以防它被添加到Java的后续版本中。
如果goto
不在列表中,并且稍后将其添加到语言中,则使用单词goto
作为标识符(变量名,方法名等)的现有代码将会出错。但由于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;
}
}
break loops
的意思是“跳出名为loops
的循环”。也许事后来看,给标签取一个更好的名称可能是outer
。 - jonnystotenwhile (true) {
... }
会显得有些复杂。尽管goto经常因为不当使用而受到指责,但我认为与布尔字面值进行不必要的比较比使用goto更糟糕。 - Alexandercontinue LABEL;
语句结合使用也非常有用。因此,您可以继续执行外部循环。 - infotoni91http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
"const" 和 "goto" 是保留字,尽管目前未被使用。
char
不是设计用来存储数字的。它被设计成可以存储更多类型的字符。然而,与 C 或 C++ 不同,Java 不支持 unsigned
数字。 - Tech Expert Wizard所以如果语言设计者感觉有需要,这些关键字可能某一天会被使用。
另外,如果来自具有这些关键字的语言(例如C、C++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误提示信息。
或许只是为了阻止程序员使用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
语句进行(但在汇编语言中,这些被称为跳转或分支指令)。goto
是有意义的。goto
,而是使用更高级别的结构,比如函数、for、foreach 和 while 循环来控制程序流程。想象一下,如果你在一个函数中执行一个 goto
到另一个函数的标签,当另一个函数返回时会发生什么?这个想法是荒谬的。goto
语句但不允许其编译,但重要的是要知道为什么在较低级别的应用程序中首先使用了 goto
,以及为什么在 Java 中使用它是没有意义的。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");
}
}
break
和continue
不好。 - pjp