代码之家  ›  专栏  ›  技术社区  ›  Amy B

“循环:”在Java代码中。这是什么?为什么要编译?

  •  100
  • Amy B  · 技术社区  · 14 年前

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

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

    ( line 137 here )

    我以前从来没有见过这个,我不知道Java有一个“循环”关键字(NETBESE甚至不把它像关键字一样着色),它确实用JDK 6编译得很好。

    解释是什么?

    12 回复  |  直到 5 年前
        1
  •  190
  •   SOFe    7 年前

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

    Documentation .

        2
  •  72
  •   Peter Mortensen John Conde    5 年前

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

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

    这样可以断开外部回路。

    Link to documentation .

        3
  •  31
  •   Peter Mortensen John Conde    5 年前

    回答问题,但作为旁注:

    我听说过一些面试问题:“为什么Java代码是有效的?”(去掉了更简单的例子;下面是更简单的例子,thx tim b_¼the):

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

    你们都知道这个代码是什么吗(除了糟糕之外)?

    解决方案:两个标签, url http 一个评论 www.myserver.com/myfile.mp3 以及具有相同名称的参数的方法调用( 网址 )作为标签。是的,这会编译(如果在其他地方定义方法调用和局部变量)。

        4
  •  16
  •   Michael Borgwardt    14 年前

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

    outer:
    for(;;){
        inner:
        for(;;){
            if(){
                break inner; // ends inner loop
            } else {
                break outer; // ends outer loop
            }
        }
    }
    
        5
  •  5
  •   Peter Mortensen John Conde    5 年前

    它不是一个关键字;它是一个 label .

    它允许你去一个有标签的 break 并贴上标签 continue .

        6
  •  4
  •   Jay    10 年前

    这确实是SeaNeisher对Org.javeLay.java的回答的回答,但是我想输入一些代码,所以我不能使用注释特性。

    虽然我很少使用“break label”,但它确实偶尔发生。最常见的情况是,当我在一个需要嵌套循环来搜索的结构中搜索某些内容时,例如:

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

    通常在这种情况下,我将整个对象推入子例程,以便在命中时返回找到的对象,如果它落在循环的底部,我可以返回空值来指示未找到的对象,或者抛出异常。但这有时是有用的。

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

    非常晚的附录:

    有一次我看到一行很好的代码。程序员写道:

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

    他其实不是说“example.com”,而是说我们公司的网站。

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

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

        7
  •  4
  •   Peter Mortensen John Conde    5 年前

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

    它被用于 line 148 .

        8
  •  2
  •   SoulWanderer    14 年前

    你几乎可以写任何东西,因为它是一个标签… 你有个例子 here

        9
  •  2
  •   Peter Mortensen John Conde    5 年前

    它是一个标签,不过请看下面的示例:

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

    什么时候? b>10 执行流转到外部循环。

        10
  •  1
  •   Peter Mortensen John Conde    5 年前

    它是一个标签,爪哇的标签可以与 break continue 用于对循环进行额外控制的关键字。

    这里用一种相当好的方式解释:

    Thinking in Java, break and continue

        11
  •  1
  •   Peter Mortensen John Conde    5 年前

    它不是关键字,而是 标签 . 如果里面 for 你写的循环 break loop; ,然后退出循环。

        12
  •  0
  •   Peter Mortensen John Conde    5 年前

    这是一个标签。通常,Java中使用的标签将控制流传递到所需的位置,而所有关键字(如继续和中断)都具有指定的位置选择。