关于语法:Java中有GOTO语句吗?

Is there a goto statement in Java?

我对此很困惑。我们中的大多数人都被告知Java中没有任何GOTO语句。

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


詹姆斯戈斯林在支持goto语句的情况下创建了最初的JVM,但随后他删除了这个不必要的特性。不需要goto的主要原因是,通常可以用可读性更强的语句(如break/continue语句)或将一段代码提取到一个方法中。

来源:James Gosling,问答环节


Java关键字列表指定EDCOX1的1个关键字,但它被标记为"未使用"。

它在原始的JVM中(见@vitalifedorenko的回答),但随后被删除。它可能被保留为一个保留关键字,以防它被添加到Java的后期版本中。

如果goto不在列表中,并且后来被添加到语言中,那么使用goto一词作为标识符(变量名、方法名等)的现有代码将中断。但是,由于goto是一个关键字,这种代码在目前甚至不会编译,而且在以后仍然有可能让它实际做一些事情,而不破坏现有的代码。


关键字存在,但未实现。

使用goto的唯一好理由是:

1
2
3
4
5
6
7
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:

在爪哇,你可以这样做:

1
2
3
4
5
6
7
loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}


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

"The keywords const and goto are
reserved, even though they are not
currently used."


因此,如果语言设计者觉得有必要,他们有一天可以使用。

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

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


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

The keywords const and goto are reserved, even though they are not currently used.

Java中没有GOTO语句的原因可以在"Java语言环境"中找到:

Java has no goto statement. Studies illustrated that goto is (mis)used more often than not simply"because it's there". Eliminating goto led to a simplification of the language--there are no rules about the effects of a goto into the middle of a for statement, for example. Studies on approximately 100,000 lines of C code determined that roughly 90 percent of the goto statements were used purely to obtain the effect of breaking out of nested loops. As mentioned above, multi-level break and continue remove most of the need for goto statements.


如何在Java中使用"继续"标签的例子是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
    }
}

结果:

1
2
3
4
5
6
I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1

不,不使用goto,但您可以定义标签并在标签上留下一个循环。您可以使用breakcontinue后跟标签。所以您可以跳出多个循环级别。看看这个教程。


重要的是要理解,goto结构是程序员用机器代码和汇编语言编程时遗留下来的。由于这些语言非常基础(如,每个指令只做一件事),所以程序控制流完全是用goto语句完成的(但在汇编语言中,这些指令称为跳转或分支指令)。

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

很明显,Java是C/C++的演进。Java与C共享很多特性,但是抽象了更多的细节,因此只是写得不一样。Java是一种非常高级的语言,所以简单地说,当像函数、每个循环和while循环这样的更高级的结构执行程序控制流时,就不必有像EDCOX1 0级这样的低级特征。想象一下,如果您在一个函数中,并将goto转换为另一个函数的标签。当另一个函数返回时会发生什么?这个想法很荒谬。

这不一定回答为什么Java包含EDCOX1的0Ω语句,但不会让它编译,但重要的是要知道为什么EDOCX1 0的引用在最初的地方被使用,在较低级别的应用程序中,以及为什么在Java中使用它是没有意义的。


不,谢天谢地,Java中没有EDCOX1 1Ω。

goto关键字只保留,不使用(const也一样)。


因为它不受支持,为什么您要一个没有任何作用的goto关键字或一个名为goto的变量?

尽管您可以使用break label;continue label;语句来有效地执行goto所做的操作。但我不推荐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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");
     }
}


不,EDCOX1 1Ω在Java中不使用,尽管它是保留字。对于const也是如此。这两种都在C++中使用,这可能是它们被保留的原因;其意图可能是避免混淆C++程序员迁移到Java,也可能保留在以后的Java修改中使用它们的选项。


正如所指出的,Java中没有EDCOX1 1,但是在Sun感觉像一天添加EDCOX1,1,to Java的情况下,关键字被保留了。他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。注意,在Java 5中,他们添加了EDCOX1,17,}关键字,也没有破坏太多代码。

虽然Java没有EDCOX1的1度,但它有一些与goto的用法相对应的结构,即EDCOX1×20和EDCOX1,21,具有命名的循环。另外,finally可以看作是一种扭曲的goto


禁止声明具有相同名称的变量。

例如int i = 0, goto;


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

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

goto是保留的,即使它当前没有被使用,也不要说永远不会。)


请注意,您可以用

  • 返回

  • 打破

  • 中断标签

  • 最后扔进去试着接球


我也不喜欢goto,因为它通常会降低代码的可读性。但是,我相信这个规则有例外(特别是在涉及到lexer和parsers的时候!)

当然,通过将程序翻译成类似汇编程序的格式,然后编写类似于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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的代码更可读,不是吗?


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

如果有人告诉你Java中没有GOTO语句,你就被愚弄了。实际上,Java由两层"源代码"组成。


它被认为是您不需要做的事情之一,但可能被列为一个保留字,以避免开发人员混淆。


因为Java语言不使用它,JVM字节码确实如此。


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

但是如果你使用Jasmin或者其他低级语言,它被转换成字节码,那么"goto"就存在了。


Goto不是Java

你必须用goto但它不能正常工作。在关键的Java字中,它不被使用。http://docs.oracle.com/javase/tutorial/java/nutsandbolts//u keywords.html

1
2
3
4
5
6
7
   public static void main(String[] args) {            
            GOTO me;
            //code;
            me:
            //code;
            }  
   }