11

当我发现一段被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 中看到像这样的单词之后的冒号。

谢谢!

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

4

4 回答 4

17

这里,scan:只是一个标签。该break <label>语法允许人们跳出外部循环,并模拟某些形式的goto语句。语法记录在JLS中:

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

于 2013-01-03T21:50:18.453 回答
2

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

于 2013-01-03T21:50:00.893 回答
2

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

例子

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

   } 

 }
于 2013-01-03T21:50:35.727 回答
1

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

如果您查看您的代码,您会在下面看到

 break scan;

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

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

于 2013-01-03T21:51:52.563 回答