如何标记并突破捕获块?

Krö*_*röw 0 java break

try...catch我的代码在某处有一个构造:

try {
    // Some code.
} catch (Exception e) {
    if (condition) {
        // Break out of catch block.
    }
    // Continue catch block.
}
Run Code Online (Sandbox Code Playgroud)

如何标记我的catch块,以便可以break LABEL_NAME;代替编写// Break out of catch block.,以便执行try...catch完全退出该构造?

尝试次数

我希望能够在catch关键字之前放置标签:

try { }
LBL: catch(Exception e) { }
Run Code Online (Sandbox Code Playgroud)

因为标签在许多其他语言结构(例如LBL: if(...LBL: for(...)中会位于关键字之前,但会引起语法错误。

我也无法在catch(Exception e)代码后放置标签。

编辑

这个问题纯粹是出于好奇的人们如何在Java中实现这一点。我非常清楚,还有其他方法可以控制代码块中的执行流程。

如果我曾经碰到这些代码已经贴上了catch使用标签从块或一些类似的块,和休息,我想知道到底是什么代码在做什么,它是如何做的。

And*_*ner 6

关于您是否应该使用标签的评论,我在辩论中的立场:我的立场是不惜一切代价避免,除非替代方案更糟。

在这种情况下,似乎最简单的是反转条件:

try {
    // Some code.
} catch (Exception e) {
    if (!condition) {
      // Continue catch block.
    }
}
Run Code Online (Sandbox Code Playgroud)

假设Continue catch block代码不是很大(这本身是不希望的),这似乎比包含标签要好。


就像Kröw答案的替代方法一样,虽然您不能标记a catch(因为它不是语句),但是您可以在catch(因为语句是语句)中定义标记的块:

    try {
      // Some code.
    } catch(Exception e) {
      LABEL:
      {
        if (condition) {
          break LABEL;
        }
        // Remaining code.
      }
    }
Run Code Online (Sandbox Code Playgroud)

这很粗糙,但是具有标签更靠近中断的优点(例如,如果“ // Some code”很长,可能不清楚您要中断的内容)。

但是,如果您在此处引入额外的缩进级别,则最好也使用它来if (!condition)代替。


Krö*_*röw 5

要突破catchtry需要标记为:

LABEL: try {
   // Some code.
} catch(Exception e) {
   if(condition) {
      break LABEL;
   }
   // Remaining code.
}
Run Code Online (Sandbox Code Playgroud)

同样,我确定此代码还有很多更好的替代方法,但这可以回答问题的明确要求。