&引用;循环:";在Java代码中。这是什么,为什么要编译?

&引用;循环:";在Java代码中。这是什么,为什么要编译?,java,labeled-statements,Java,Labeled Statements,这段代码让我盯着屏幕看了几分钟: loop: for (;;) { // ... } () 我以前从未见过这种情况,我也不知道Java有一个“循环”关键字(NetBeans甚至没有把它涂成关键字),而且它可以用JDK 6很好地编译 解释是什么?它不是关键字而是标签 用法: label1: for (; ; ) { label2: for (; ; ) { if (condition1) {

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

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

我以前从未见过这种情况,我也不知道Java有一个“循环”关键字(NetBeans甚至没有把它涂成关键字),而且它可以用JDK 6很好地编译


解释是什么?

它不是
关键字
而是
标签

用法:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

.

这不是一个关键词;这是一个好主意


它允许您进入标记为
的中断
和标记为
的继续

它是一个中断点标签,允许您从指定的循环中中断,而不仅仅是您碰巧处于的最里面的循环


它在上使用。

它是一个标签,Java中的标签可以与
break
continue
关键字一起使用,以实现对循环的额外控制

这里有一个很好的解释:


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

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}
这允许断开外环


.

这是一个标签,但请看以下示例:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }
inta=0;
int b=0
而(a10){
打破第一个循环;
}
}
}

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

这不是关键字,而是标签。它用于嵌套循环中的
break
continue
关键字:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

你几乎可以写任何东西,因为它是一个标签。。。
你有一个例子,它不是一个关键字,而是一个标签。如果在
for
循环中写入
中断循环,然后退出该循环。

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

我听说过一些采访问题“为什么这个Java代码有效?”(去掉了更简单的例子;这里是一个更刻薄的例子,thx Tim Büthe):

url:http://www.myserver.com/myfile.mp3
下载(网址);
你们都知道这个代码是什么吗


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

这实际上是对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:”是一个他从不提及的标签。然后“/”使行的其余部分成为注释。

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

值得一提的是,OP可能不熟悉goto/label概念,通常认为这是一种不好的做法,除非在非常特殊的情况下(例如,用于缩短多个嵌套循环)@haylem是真的,但我想进一步说:多个嵌套循环通常也是一种不好的做法。每当我使用循环标签时,我最终都会重构代码,这样我就不需要它们了。总有更好的方法。
internal
标签在这里是无用的,
break;
足够了如果有两种方法来打破循环,我很感激
Internal
为清晰起见,使用标签。@gertas:我认为他只是在说明这一点。但根据Steve Jackson的说法,出于自我记录的目的,说出来可能是个好主意。仅供参考,你不需要循环,a;下一行是足够的感谢你提醒我,我认为问题中没有循环。我将编辑我的答案(我从未被问过这个问题,但面试官是我的前同事)