在 Java 中使用带标签的 break 是一种很好的做法吗?

2022-08-31 11:02:42

我盯着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


答案 1

不,它不像goto,因为你不能“去”控制流的另一部分。

在您链接的页面中:

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

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

请考虑以下示例:

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++) {

}

您可以替换为 或(以中断外部或内部循环),因为当您命中语句时,两个循环都在执行,但替换为 不会编译。xxxfirstsecondbreakxxxthird


答案 2

它并不像它那么可怕,因为它只将控制权发送到标记语句的末尾(通常是循环构造)。使不可接受的是,它是指向任何地方的任意分支,包括在方法源中更高位置找到的标签,以便您可以拥有自行开发的循环行为。Java中的标签中断功能不允许这种疯狂,因为控制只会向前发展。gotogoto

大约12年前,我只用过一次,在我需要打破嵌套循环的情况下,结构更结构化的替代方案将使循环中的测试更加复杂。我不建议经常使用它,但我不会将其标记为自动的不良代码气味。


推荐