Java中是否有goto语句?

Ven*_*kat 252 java syntax goto keyword

我对此感到困惑.我们大多数人都被告知Java中没有任何goto语句.

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

Vit*_*nko 222

James Gosling在支持goto语句的情况下创建了原始JVM ,但随后他将此功能删除为不必要的.主要原因goto是不必要的,通常它可以用更易读的语句(例如break/continue)或通过将一段代码提取到方法中来替换.

资料来源:James Gosling,问答环节

  • 有时候,明智地使用"goto"**是表达某种东西的最容易和最明确的方式,所以强迫它进入其他任何东西都是不那么可读**. (42认同)
  • "......或者通过将一段代码提取到一个方法中" - 如果没有正确的尾调用,它必须非常酷. (23认同)
  • Goto 作为 Java 中的保留关键字非常棒,因为它可以防止人们将标签命名为“goto:”。 (3认同)
  • @Deduplicator goto 的使用虽然很明智,但总是容易出错。 (2认同)
  • grml...我现在必须以更大的*和* __less__ 可读性重写一小段代码,因为 Java™ 不支持 `goto`... (2认同)

Tho*_*mas 193

Java的关键字列表指定的goto关键字,但它被标记为"未使用".

它是在原始的JVM中(见@VitaliiFedorenko的回答),但随后删除了.它可能保留为保留关键字,以防它被添加到更高版本的Java中.

如果goto不在列表中,并且稍后将其添加到该语言中,则使用该单词goto作为标识符(变量名,方法名等等)的现有代码将会中断.但因为goto是一个关键字,这样的代码甚至不会在当前编译,并且仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码.

  • `这可能是为了将它添加到Java的更高版本中.实际上,主要原因有点不同(参见下面的答案) (29认同)
  • 这是一个好的和有趣的信息,但它不能解释为什么它仍然是一个保留的关键字. (2认同)

jon*_*ten 146

关键字存在,但未实现.

我能想到的唯一使用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:
Run Code Online (Sandbox Code Playgroud)

在Java中,你可以这样做:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @assylias嗯,不太好.标签标记外环.然后`break loops`意味着"突破循环称为`循环`".也许回想起来,标签的更好名称可能是"外部". (20认同)
  • "使用goto的唯一理由"需要无条件无限循环的快速而肮脏的小程序充分利用了goto.使用`while(true){`...`}`是过度的.GOTO经常因其不当用途而受到侮辱,但我认为对布尔文字的不必要比较比GOTO更糟糕. (8认同)
  • 我最近发现,这种标记技术与 `continue LABEL;` 语句结合使用也非常有用。因此,您可以继续进行外部躺卧循环。 (2认同)

Isa*_*c E 43

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

"保留关键字const和goto,即使它们目前尚未使用."

  • "没有签名"甚至没有!(叹) (12认同)
  • @mwieczorek 不是全部。“char”是一种原始类型,它是无符号的。 (2认同)

dav*_*ave 29

因此,如果语言设计者感到需要,他们可以在某一天使用.

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

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


Hei*_*nzi 19

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

关键字const和goto是保留的,即使它们当前未被使用.

究其原因,为什么没有在Java中没有goto语句可以在"发现Java语言环境 ":

Java没有goto语句.研究表明,goto(错误)的使用频率高于"因为它存在".消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则.对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果.如上所述,多级中断并继续删除对goto语句的大部分需求.

  • 那么当需要的时候那10%呢? (2认同)

and*_*rew 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1
Run Code Online (Sandbox Code Playgroud)


Arn*_*ter 10

不,goto不使用,但您可以定义标签并在标签上留一个循环.您可以使用breakcontinue遵循标签.所以你可以跳出多个循环级别.看看教程.


小智 10

重要的是要理解goto构造函数是程序员用机器代码和汇编语言编程的日子里的残余.因为这些语言是如此基本(例如,每个指令只做件事),程序控制流程完全用goto语句完成(但在汇编语言中,这些被称为跳转分支指令).

现在,虽然C语言相当低级,但它可以被认为是非常高级的汇编语言 - C中的每个语句和函数都可以很容易地分解为汇编语言指令.尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统.因为C的函数如此密切地反映了汇编语言的功能,所以它只goto包含在C 语言中.

很明显,Java是C/C++的演变.Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写.Java是一种非常高级的语言,因此没有必要具有低级功能,例如goto当更多高级构造(如函数),for,for循环和while循环执行程序控制流程时.想象一下,如果你在一个函数中,并将goto标签转换为另一个函数.当其他函数返回时会发生什么?这个想法很荒谬.

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


Boz*_*zho 9

不,谢天谢地,gotoJava中没有.

goto关键字仅保留,但未使用(同样适用const).


pjp*_*pjp 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");
     }
}
Run Code Online (Sandbox Code Playgroud)

  • -1为什么不允许我有一个名为goto的变量或方法? (10认同)
  • 因为它在编程领域具有不适用于Java的含义.它也是变量名称的不良选择. (4认同)
  • -1:首先,仅仅因为Java不支持"goto"流控制语句,并不意味着它具有不执行任何操作的"goto"关键字.其次,"goto"可能是一个糟糕的变量名,但它可能是一个很好的方法名,我们不能使用它,因为"goto"是一个关键字.第三,"破坏标签"和"继续标签"的存在是有充分理由的,所以"不推荐它"并不是很有用.第四,由于Sun称其"目前尚未使用",因此很可能意味着他们曾经计划实施,但不想在他们另有决定时删除该关键字. (3认同)
  • @VojislavStojkovic那只是疯狂的谈话.1)*是*为什么它什么也不做是因为它不支持它.根据JLS`保留关键字const和goto,即使它们当前未被使用.如果这些C++关键字错误地出现在程序中,这可能允许Java编译器产生更好的错误消息.这意味着"我们不使用它,所以如果你来自C++背景我们不会让你使用它一点都没有." 2)`goto`是一个可怕的方法名称.抱歉.3)建议中断和继续,但*不是这里使用的方式*.4)"最有可能"[引证需要]. (2认同)

Mic*_*rdt 7

不,goto不是在Java中使用,尽管是一个保留字.同样如此const.这两个都用在C++中,这可能是它们被保留的原因; 其目的可能是避免让迁移到Java的C++程序员感到困惑,也许还要保留在Java的后续版本中使用它们的选项.

  • @Bozho:嗯,它*可以用于一些与旧的"有害"goto完全无关的巧妙新功能. (6认同)

小智 5

是的,这是可能的,但不如 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");
 }
Run Code Online (Sandbox Code Playgroud)

向后跳转:

 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");
 }
Run Code Online (Sandbox Code Playgroud)