Java中有goto语句吗?

我对此感到困惑。我们大多数人都听说过Java中没有goto语句。

但我发现它是Java中的关键字之一。它可以在哪里使用?如果它不能使用,那么为什么它作为关键字包含在Java中?

442301 次浏览

因此,如果语言设计者觉得有必要的话,它们是可以被使用的。

此外,如果来自具有这些关键字的语言的程序员(例如。C, c++)错误地使用它们,那么Java编译器可以给出有用的错误消息。

或者只是为了阻止程序员使用goto:)

禁止声明同名变量。

< p >。 int i = 0, goto; < / p >

因为它不受支持,为什么你想要一个什么都不做的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");
}
}

请参阅下面的链接,它显示了所有java保留字,并告诉您添加了哪些版本。

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

Goto是保留的,即使目前没有使用,但永远不要说永远:)

请注意,您可以将goto的大多数良性用途替换为by

  • 返回

  • 打破

  • 打破< em >标签< / em >

  • 扔进去,试着抓住,最后

不,谢天谢地,Java中没有goto

goto关键字只保留,但不使用(const也是如此)。

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

关键字const和goto是 矜持,尽管事实并非如此 目前使用的。" < / p >

Java关键字列表指定了goto关键字,但它被标记为“未使用”。

它在最初的JVM中(参见回复@VitaliiFedorenko),但后来被删除了。它可能被保留为一个保留关键字,以防它被添加到Java的后期版本中。

如果goto不在列表中,并且它稍后被添加到语言中,则使用goto作为标识符(变量名、方法名等)的现有代码将被破坏。但是因为goto是一个关键字,这样的代码在当前甚至不会编译,并且它仍然有可能在不破坏现有代码的情况下让它实际做一些事情。

不,goto在Java中不使用,尽管它是一个保留字。const也是如此。这两个都在c++中使用,这可能是它们被保留的原因;这样做的目的可能是为了避免让迁移到Java的c++程序员感到困惑,也可能是为了在以后的Java版本中保留使用它们的选项。

它们被保留以供将来使用(参见:Java语言关键字)

关键字const和goto是保留的,即使它们目前没有被使用。

Java中为什么没有goto语句的原因可以在"Java语言环境"中找到:

Java没有goto语句。研究表明,goto经常被(错误地)使用,而不仅仅是“因为它在那里”。取消goto导致了语言的简化——例如,没有关于goto进入for语句中间的效果的规则。对大约10万行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。如上所述,多级中断和继续消除了对goto语句的大部分需求。

正如前面指出的,在Java中没有goto,但是关键字是保留的,以防有一天Sun想要在Java中添加goto。他们希望能够在不破坏太多代码的情况下添加它,所以他们保留了关键字。注意,在Java 5中,他们添加了enum关键字,它也没有破坏那么多代码。

虽然Java没有goto,但它有一些构造对应于goto的一些用法,即能够使用命名循环breakcontinue。另外,finally可以被认为是一种扭曲的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没有被使用,但是你可以定义标签并留下一个到标签的循环。可以使用breakcontinue后跟标签。所以你可以跳出多个循环层。看一下本教程

它被认为是不能做的事情之一,但可能被列为保留词,以避免开发人员感到困惑。

James Gosling创建了支持goto语句的原始JVM,但后来他删除了这个不必要的特性。不需要goto的主要原因是,通常可以用更易读的语句(如break/continue)或将一段代码提取到方法中来替换它。

来源:詹姆斯·高斯林,问答环节

goto构造是程序员用机器代码和汇编语言编程时遗留下来的,理解这一点很重要。因为这些语言非常基础(比如,每条指令只做一个的事情),程序控制流完全用goto语句完成(但在汇编语言中,这些被称为分支指令)。

现在,虽然C语言是相当低级的,但它可以被认为是非常高级的汇编语言——C中的每个语句和函数都可以很容易地分解成汇编语言指令。尽管C语言不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。因为C的函数非常接近汇编语言的函数,所以只有goto包含在C中才有意义。

很明显,Java是C/ c++的进化。Java共享了C的许多特性,但抽象了更多的细节,因此只是编写方式不同。Java是一种非常高级的语言,所以当更高级的结构如函数、for、for each和while循环执行程序控制流时,就没有必要具有像goto这样的低级特性。想象一下,如果你在一个函数中,对另一个函数的标签执行goto。当另一个函数返回时会发生什么?这种想法是荒谬的。

这并不一定能回答为什么Java包含goto语句却不让它编译,但重要的是要知道为什么goto在较低级的应用程序中被首先使用,以及为什么在Java中使用它没有意义。

因为尽管Java语言不使用它,但JVM字节码使用它。

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto

如果有人告诉你Java中没有goto语句,那你就被骗了。事实上,Java由两层“源代码”组成。

如何在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

当然,它是关键字,但它不在源代码级别上使用。

但如果使用jasmin或其他转换为字节码的低级语言,那么“goto”就在那里

我也不是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的代码可读性强得多,不是吗?

转到不在Java

你必须使用GOTO 但它不能正常工作。在关键的Java词中,它没有被使用。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html < / p >

   public static void main(String[] args) {
GOTO me;
//code;
me:
//code;
}
}

是的,这是可能的,但不像在c#(在我看来,c#更好!)那些总是模糊软件的观点是愚蠢的!很遗憾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");
}