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

什么';在Java中使用带标签的语句有什么意义?,java,label,Java,Label,我正忙着准备我的证书,我偶然发现了一个我以前从未听说过的概念——“标签声明”。e、 g: “标签”:“声明” L1: while(i < 0){ L2: System.out.println(i); } L1:while(i标签来提供上下文时更有意义;而其他人则认为后者只是额外的杂波。)然后还可以在循环上下文之外使用带标签的语句,例如LABEL1:System.out.println(“Hello”);LABEL2:继续LABEL1;这将本质上创造一个永无止境的循环?换句话说,

我正忙着准备我的证书,我偶然发现了一个我以前从未听说过的概念——“标签声明”。e、 g:

“标签”:“声明”

L1: while(i < 0){
     L2: System.out.println(i);
}
L1:while(i<0){
L2:系统输出打印LN(i);
}

所以我的问题是。。为什么?这有什么用处?什么时候可以使用这样的东西?

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

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
循环中放置中断/继续,则此方法偶尔会有用


不过,我倾向于每隔几年才使用一次。因为它们是一种很少使用的构造,所以它们很难理解,所以如果代码可以用另一种方式清楚地编写,我将避免使用标签。

我认为它们是必需的,这样你就可以在假装编写Java的同时编写Fortran。如果没有它们,格言——无论他们使用什么语言——都可能无效。

我过去常常将它们用作注释语句:)撇开玩笑不谈,它就像basic中的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;
    }
扫描:{
INTC;
对于(firstUpper=0;
第一上限<计数;
firstUpper+=字符.字符数(c)){
c=代码点(第一个上限);
if(c!=字符。toLowerCase(c)){
中断扫描;
}
}
归还这个;
}

它可用于避免使用“未找到”标志

这可能是对标签的误用,但您可以使用它们来打破循环

LABEL: {
    if(condition)
       break LABEL;
    // do something
}
它也可以用来迷惑人,这是避免它的一个很好的理由


下面是一个异常的
中断
的示例,其他回复可能会遗漏该示例。它允许在switch{}语句中中断循环:

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

}

正如其他答案所述,标签是Java语言中很少使用的一部分

但在您的情况下,应考虑其他一些事项:

  • 标签相当“通用”,实际上是行号:
    L1
    L2

  • 代码中未使用标签

  • 您正在学习认证材料


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

这可以解释
L1
的用法,但是
L2
呢?@Baz我认为L2只是为了显示语法。这是从我的课本上抄下来的。书中也没有提到L2。@DeanGrobler啊,我明白了。我想不出
L2
@Baz有什么用——你说得对——我只是把
L2
去掉了,因为它完全没有必要。尽管它确实表明您可以自由标记任何语句,即使您没有使用这些标签的代码。有时候,标签一堆东西可能会更清楚(例如,有些人可能会认为,<代码>外< /Cult>标签在有一个<代码>内部< /代码>标签来提供上下文时更有意义;而其他人则认为后者只是额外的杂波。)然后还可以在循环上下文之外使用带标签的语句,例如LABEL1:System.out.println(“Hello”);LABEL2:继续LABEL1;这将本质上创造一个永无止境的循环?换句话说,使用循环结构之外的标签标签可以在类中的任何地方跳转?我同意这句话(尽管我自己不会FORTRAN),甜蜜的回忆-我还是个孩子(我猜是10岁)读到编程的真正男子气概。。。真是好东西。顺便说一句,答案确实漏掉了一个指向原始故事的链接(可能还有关于Mel的链接)@bestsss:如果你想通过链接来改进这个“答案”,那就这样吧。好吧,Mel故事还解决了(无限)循环和缺少
break
@bestsss的问题,我不确定这些链接与这个问题有什么关系,但是谢谢你分享这些。它们是伟大的作品。@Simon,真正的程序员不怕使用GOTOs
break/continue标签
实际上是GOTO,对于非常有用的最后一个代码片段,您再也没有比这更好的了(在java中,就是这样)+1了@安德泽多耶:我喜欢边缘案例
http://www.google.com
while(true) break http;
loop: for(;;){
  int c=in.read();
  switch(c){
  case -1:
  case '\n':
    break loop;
  case 'a':
    processACommand();
    break;
  case ...
  default:
    break;
  }

}