【问题标题】:Labeled Statement block in Java?Java中的标记语句块?
【发布时间】:2012-12-18 08:11:35
【问题描述】:

当我发现一段代码被scan: {} 块包围时,我正在浏览一些基本的Java 对象。以下代码来自 String 类中的 toLowerCase() 方法。

scan: {
            for (firstUpper = 0 ; firstUpper < len; ) {
                char c = value[firstUpper];
                if ((c >= Character.MIN_HIGH_SURROGATE)
                        && (c <= Character.MAX_HIGH_SURROGATE)) {
                    int supplChar = codePointAt(firstUpper);
                    if (supplChar != Character.toLowerCase(supplChar)) {
                        break scan;
                    }
                    firstUpper += Character.charCount(supplChar);
                } else {
                    if (c != Character.toLowerCase(c)) {
                        break scan;
                    }
                    firstUpper++;
                }
            }
            return this;
        }

有人能解释一下scan:{} 块的用途以及这个语法​​的来源吗?除非在三元运算符中使用,否则我还没有在 Java 中看到这样的单词后面有冒号。

谢谢!

编辑:更新标题以正确匹配已回答的问题。

【问题讨论】:

    标签: java syntax


    【解决方案1】:

    这是一个labeled block.,其中scan:是一个标签。它通常在中断/继续时使用,以防您有多个循环。 在这种情况下,break scan; 只是在执行时打破了标记的块(扫描)。

    【讨论】:

      【解决方案2】:

      在这里,scan: 只是一个labelbreak &lt;label&gt; 语法允许跳出外部循环,并模拟goto 语句的某些形式。语法记录在JLS:

      带有标签Identifierbreak 语句尝试将控制转移到带有相同标签Identifier 的封闭标签语句(第14.7 节);此语句称为中断目标,然后立即正常完成。在这种情况下,中断目标不必是switchwhiledofor 语句。

      【讨论】:

      • 这种做法是否和 goto 的一样受辱?
      • @Daniel:我不想开始任何宗教辩论。 ;) 然而,由于这种形式可以被认为比原始的goto 更“结构化”,我想一些反goto 的拥护者可能会认为它不那么令人反感。
      • @Daniel 不,因为您不能使用它在代码中任意跳转。在嵌套循环中使用break 来指定要跳出的循环非常有用。
      • @NPE:您的链接完美地回答了我的问题,并完全解释了为什么我无法找到扫描块!再次感谢
      【解决方案3】:

      您可以设置标签以在多个循环深处中断/或继续。

      例子

       outer:
       for(int i=...){
         for(int j=..){
           ...
           break outer; // leaves both loops   
      
         } 
      
       }
      

      【讨论】:

        【解决方案4】:

        这是一个label。是流量控制的指标。

        如果您查看您的代码,您会看到以下内容

         break scan;
        

        发生这种情况时,流程会完全退出 scan 块。

        顺便说一句,它可以是任何标识符,scan 根本不是关键字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-08
          • 2019-02-21
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 2014-11-15
          相关资源
          最近更新 更多