在Java中使用带标签的语句有什么意义?

时间:2012-08-22 10:15:47

标签: java label

我正忙着学习我的认证,我偶然发现了一个我以前从未听过的概念 - “标签声明”。 e.g:

'label':'声明'

L1: while(i < 0){
     L2: System.out.println(i);
}

所以我的问题是......为什么?这有什么用,什么时候想用这样的东西?

6 个答案:

答案 0 :(得分:25)

我所知道的唯一用途是您可以在breakcontinue语句中使用标签。因此,如果您有嵌套循环,那么这是一次突破多个级别的方法:

OUTER: for (x : xList) {
          for (y : yList) {
              // Do something, then:
              if (x > y) {
                  // This goes to the next iteration of x, whereas a standard
                  // "continue" would go to the next iteration of y
                  continue OUTER;
              }
          }
       }

如示例所示,如果您以嵌套方式一次迭代两件事(例如搜索匹配项)并希望继续 - 或者如果您正在进行正常迭代,但由于某种原因需要,它偶尔会有用在嵌套的for循环中放置/继续。

但是,我倾向于每隔几年只使用一次。有鸡和鸡蛋,因为它们是一种很少使用的构造,所以很难理解,所以如果代码可以用另一种方式清楚地写出来,我将避免使用标签。

答案 1 :(得分:21)

它可以用来避免需要“未找到”标志。

FOUND: {
  for(Type t: list)
     if (t.isTrue())
        break FOUND;

  // handle not found.
}

这可能是对标签的误用,但你可以使用它们在没有循环的情况下破解。

LABEL: {
    if(condition)
       break LABEL;
    // do something
}

它也可以用来混淆人,这是避免它的一个很好的理由。 ;)

http://www.google.com
while(true) break http;

答案 2 :(得分:2)

我认为它们是必需的,因此您可以在假装编写Java时编写Fortran。没有它们,格言 Real programmers write in Fortran无论使用何种语言都可能无效。

答案 3 :(得分:2)

我曾经把它们用作评论语句:)除了笑话之外,它就像基本的Go to语句,它允许你跳转到一行代码,即在深度循环结构中......

用法:

scan: {
      int c;
      for (firstUpper = 0 ;
          firstUpper < count ;
          firstUpper += Character.charCount(c)) {
        c = codePointAt(firstUpper);
        if (c != Character.toLowerCase(c)) {
          break scan;
        }
      }
      return this;
    }

答案 4 :(得分:2)

以下是其他回复可能错过的过度break的示例。它允许在switch {}语句中打破一个循环:

loop: for(;;){
  int c=in.read();
  switch(c){
  case -1:
  case '\n':
    break loop;
  case 'a':
    processACommand();
    break;
  case ...
  default:
    break;
  }

}

答案 5 :(得分:0)

正如其他答案所述,标签很少被用作Java语言的一部分。

但在你的情况下,还应该考虑其他一些事情:

  • 标签非常“通用”,实际上是行号:L1L2,...

  • 代码中未使用标签。

  • 您正在学习认证材料。

这意味着,L1L2标签只是行号。我假设,解释代码的文本是指行号。同样地,一些书籍和论文列举了所有数学术语,只是为了在文本中引用它们或使引文更容易。