119

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

loop:
for (;;) {
    // ...
}

此处为第 137 行

我以前从未见过这种情况,而且我不知道 Java 有一个“循环”关键字(NetBeans 甚至不会像关键字那样给它着色),而且它在 JDK 6 上编译得很好。

解释是什么?

4

12 回答 12

211

它不是一个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;
            }
        }
    }

文档

于 2010-09-29T13:05:15.877 回答
74

正如其他海报所说,它是一个标签,而不是一个关键字。使用标签允许您执行以下操作:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

这允许断开外环。

链接到文档

于 2010-09-29T13:07:29.210 回答
31

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

我听说过一些面试问题,例如“为什么这段 Java 代码有效?” (去掉了更简单的例子;这是更简单的例子,谢谢 Tim Büthe):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

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

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

于 2010-09-29T13:41:18.953 回答
16

那不是关键字,而是标签。它旨在与嵌套循环中的breakand关键字一起使用:continue

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}
于 2010-09-29T13:08:16.837 回答
5

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

它可以让你去一个有标签的break和有标签的continue

于 2010-09-29T13:05:16.703 回答
4

它是一个断点标签,允许您跳出指定的循环,而不仅仅是您碰巧所处的最里面的循环。

它在第 148 行使用。

于 2010-09-29T13:06:32.897 回答
4

这确实是对 seanizer 对 org.life.java 的回答的评论的回复,但是我想输入一些代码,所以我无法使用评论功能。

虽然我发现“中断标签”的用途非常罕见,但它确实偶尔会发生。最常见的情况是当我在需要嵌套循环搜索的结构中搜索某些内容时,例如:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

通常在这种情况下,我将整个事情推入一个子例程,以便在命中时我可以返回找到的对象,如果它落在循环的底部,我可以返回 null 以指示未找到,或者可能引发异常。但这有时很有用。

坦率地说,我认为 Java 的发明者包含了这个特性,因为在这个和异常处理之间,他们消除了 GOTO 的最后两个合法用途。

很晚的附录:

我曾经看过一段很棒的代码。程序员写道:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

他实际上并没有说“example.com”,而是我们公司的网站。

它给人的印象是代码中有一个 URL。它编译成功,就像它做某事一样。但是……它有什么作用?

实际上它什么也没做。“http:”是一个他从不引用的标签。然后“//”使该行的其余部分成为注释。

于 2010-09-29T20:53:10.620 回答
2

这是一个标签,尽管看下面的例子:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

b>10执行流程进入外循环时。

于 2010-09-29T13:07:45.980 回答
2

你几乎可以写任何东西,因为它是一个标签......你有一个例子在这里

于 2010-09-29T13:08:41.577 回答
1

它是一个标签,Java 中的标签可以与breakandcontinue关键字一起使用,以对循环进行额外控制。

在这里,它以一种相当好的方式进行了解释:

用 Java 思考,打破并继续

于 2010-09-29T13:06:51.380 回答
1

它不是关键字,而是标签。如果在for您编写的循环内break loop;,则退出该循环。

于 2010-09-29T13:39:56.257 回答
0

它是一个标签。通常是 Java 中用于在所需位置传输控制流的标签,而所有关键字(如 continue 和 break)都具有指定的位置选择。

于 2014-01-06T10:22:02.833 回答