在 Java 中使用带标签的中断是一种好习惯吗?

新手上路,请多包涵

我盯着 2001 年的一些旧代码,发现了这个声明:

    else {
     do {
       int c = XMLDocumentFragmentScannerImpl.this.scanContent();
       if (c == 60) {
         XMLDocumentFragmentScannerImpl.this.fEntityScanner.scanChar();
         XMLDocumentFragmentScannerImpl.this.setScannerState(1);
         break label913;
       }

我以前从未见过这个,并在这里发现了标记的休息时间:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

这本质上不是像 goto 那样运作吗?使用它甚至是一种好习惯吗?这让我很不安。

原文由 avgvstvs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 552
2 个回答

不,它不像 goto,因为您不能“转到”控制流的另一部分。

从您链接的页面:

break 语句终止标记语句;它不会将控制流转移到标签。控制流转移到紧跟在标记(终止)语句之后的语句。

这意味着您只能中断当前正在执行的循环。

考虑这个例子:

 first:
for( int i = 0; i < 10; i++) {
  second:
  for(int j = 0; j < 5; j ++ )
  {
    break xxx;
  }
}

third:
for( int a = 0; a < 10; a++) {

}

您可以将 xxx 替换为 firstsecond (以打破外部或内部循环),因为当两个循环都被执行时 break 语句,但将 xxx 替换为 third 将无法编译。

原文由 Thomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

它不像 goto 那样可怕,因为它只将控制发送到标记语句的末尾(通常是循环构造)。使 goto 的是它是一个任意分支到任何地方,包括在方法源代码中更高处找到的标签,因此您可以拥有自己开发的循环行为。 Java 中的标签中断功能不允许这种疯狂行为,因为控制只会向前发展。

大约 12 年前,我只用过一次,当时我需要跳出嵌套循环,结构化程度更高的替代方案会在循环中进行更复杂的测试。我不建议经常使用它,但我不会将其标记为自动的错误代码味道。

原文由 Nathan Hughes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题