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

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

‘label’:’声明’

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

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

我所知道的唯一用途是你可以在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循环中中断/继续。

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

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

 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; 

我曾经使用那些作为注释语句:)除了笑话,它就像基本的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; } 

这是一个过度break的例子,可能会被其他回复错过。 它允许在switch {}语句中打破一个循环:

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

我认为它们是必需的,因此您可以在假装编写Java时编写Fortran。 没有它们,格言真正的程序员 在Fortran中写下他们正在使用的语言可能会失效。

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

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

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

  • 标签未在代码中使用。

  • 您正在学习认证材料。

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