Java代码中的"循环:".这是什么,为什么要编译?

Amy*_*y B 107 java labeled-statements

这段代码让我盯着我的屏幕几分钟:

loop:
for (;;) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(第137行)

我以前从未见过这个,我不知道Java有一个"循环"关键字(NetBeans甚至不像关键字那样对它进行着色),并且它可以用JDK 6编译得很好.

解释是什么?

Jig*_*shi 200

它不是keyword一个label.

用法:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

文档.

  • 值得一提的是,由于OP可能不熟悉goto/label概念,它通常被认为是一种不好的做法,除非在非常特殊的情况下(例如,用于快捷多个嵌套循环). (19认同)
  • @haylem是的,但我会更进一步:多个嵌套循环通常也是一种不好的做法.每当我使用循环标签时,我最终都会重构代码,所以我不需要它们.总有比这更好的方法. (9认同)
  • TIL:如何搞砸最终维护我的代码并知道我住在哪里的暴力精神病患者. (3认同)
  • @Silence - 我打算去,但是让我等了:)现在接受并投了赞成票. (2认同)

Rob*_*rco 73

正如其他海报所说,它是一个标签,而不是一个关键词.使用标签可以执行以下操作:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}
Run Code Online (Sandbox Code Playgroud)

这允许破坏外环.

链接到文档.


Sea*_*oyd 31

问题得到了解答,但作为旁注:

我听说过面试问题"为什么这个Java代码有效?" (剥离了更简单的例子;这里是较为简单的一个,蒂姆·比斯(TimBüthe)):

url: http://www.myserver.com/myfile.mp3
downLoad(url);
Run Code Online (Sandbox Code Playgroud)

你们都知道这段代码是什么(除了可怕的)吗?

解决方案:两个标签,url以及带有与标签具有相同名称()的参数http的注释www.myserver.com/myfile.mp3和方法调用url.是的,这个编译(如果您在其他地方定义方法调用和局部变量).


Mic*_*rdt 16

这不是一个关键字,它是一个标签.它意味着与嵌套循环中的breakcontinue关键字一起使用:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果有两种方法可以打破循环,为了清晰起见,我很欣赏`inner`标签. (12认同)
  • @gertas:我认为他只是在证明这一点。但根据史蒂夫·杰克逊的说法,无论如何,为了自我记录的目的而这么说可能是个好主意。 (2认同)

cod*_*ict 5

它不是关键字; 这是一个标签.

它允许您进行标记break和标记continue.