我如何标记和突破捕获块?
How can I label and break out of a catch block?
我的代码中有一个 try...catch
结构:
try {
// Some code.
} catch (Exception e) {
if (condition) {
// Break out of catch block.
}
// Continue catch block.
}
我如何标记我的 catch
块,以便我可以写 break LABEL_NAME;
代替 // Break out of catch block.
,以便执行将完全退出 try...catch
构造?
尝试次数
我希望能够在 catch
关键字之前放置一个标签:
try { }
LBL: catch(Exception e) { }
因为在许多其他语言结构(例如 LBL: if(...
或 LBL: for(...
)中标签会出现在关键字之前,但这会引发语法错误。
我也无法将标签放在 catch(Exception e)
代码之后。
编辑
这个问题纯粹是出于对 如何 在 Java 中完成此任务的好奇。我非常清楚还有其他方法可以控制代码块中的执行流程。
如果我曾经遇到 有 标记为 catch
或一些类似块的代码,并且使用该标签从块中断开,我会想确切地知道代码在做什么以及它是如何做的。
我对评论中关于是否应该使用标签的争论的立场:我的立场是不惜一切代价避免,除非有更糟糕的选择。
在这种情况下,反转条件似乎最简单:
try {
// Some code.
} catch (Exception e) {
if (!condition) {
// Continue catch block.
}
}
假设 Continue catch block
代码不是很大(这本身就是不受欢迎的),这似乎比涉及标签更好。
作为 的替代方法,虽然您不能标记 catch
(因为它不是语句),但您可以在 catch
中定义标记块(因为一个块是一个语句):
try {
// Some code.
} catch(Exception e) {
LABEL:
{
if (condition) {
break LABEL;
}
// Remaining code.
}
}
这很恶心,但优点是标签更接近中断(例如,如果“// Some code
”很长,可能不清楚您要中断什么)。
但是,如果您要在此处引入额外的缩进级别,您也可以将其用于 if (!condition)
。
最好的方法是将代码放在一个函数中,比如说 foo。这总是比在 catch 块中使用另一个 try-catch 更好的选择。
public void foo(Boolean condition){
try {
// Some code.
} catch (Exception e) {
if (condition) {
// Break out of catch block.
return;
}
// Continue catch block.
}
}
如果在try之后或之前有任何代码:
public void bar(){
// your code
foo(codition);
// your code.
}
要突破 catch
,需要标记 try
:
LABEL: try {
// Some code.
} catch(Exception e) {
if(condition) {
break LABEL;
}
// Remaining code.
}
同样,我确信有很多更好的替代代码,但这回答了问题的明确要求。
我的代码中有一个 try...catch
结构:
try {
// Some code.
} catch (Exception e) {
if (condition) {
// Break out of catch block.
}
// Continue catch block.
}
我如何标记我的 catch
块,以便我可以写 break LABEL_NAME;
代替 // Break out of catch block.
,以便执行将完全退出 try...catch
构造?
尝试次数
我希望能够在 catch
关键字之前放置一个标签:
try { }
LBL: catch(Exception e) { }
因为在许多其他语言结构(例如 LBL: if(...
或 LBL: for(...
)中标签会出现在关键字之前,但这会引发语法错误。
我也无法将标签放在 catch(Exception e)
代码之后。
编辑
这个问题纯粹是出于对 如何 在 Java 中完成此任务的好奇。我非常清楚还有其他方法可以控制代码块中的执行流程。
如果我曾经遇到 有 标记为 catch
或一些类似块的代码,并且使用该标签从块中断开,我会想确切地知道代码在做什么以及它是如何做的。
我对评论中关于是否应该使用标签的争论的立场:我的立场是不惜一切代价避免,除非有更糟糕的选择。
在这种情况下,反转条件似乎最简单:
try {
// Some code.
} catch (Exception e) {
if (!condition) {
// Continue catch block.
}
}
假设 Continue catch block
代码不是很大(这本身就是不受欢迎的),这似乎比涉及标签更好。
作为 catch
(因为它不是语句),但您可以在 catch
中定义标记块(因为一个块是一个语句):
try {
// Some code.
} catch(Exception e) {
LABEL:
{
if (condition) {
break LABEL;
}
// Remaining code.
}
}
这很恶心,但优点是标签更接近中断(例如,如果“// Some code
”很长,可能不清楚您要中断什么)。
但是,如果您要在此处引入额外的缩进级别,您也可以将其用于 if (!condition)
。
最好的方法是将代码放在一个函数中,比如说 foo。这总是比在 catch 块中使用另一个 try-catch 更好的选择。
public void foo(Boolean condition){
try {
// Some code.
} catch (Exception e) {
if (condition) {
// Break out of catch block.
return;
}
// Continue catch block.
}
}
如果在try之后或之前有任何代码:
public void bar(){
// your code
foo(codition);
// your code.
}
要突破 catch
,需要标记 try
:
LABEL: try {
// Some code.
} catch(Exception e) {
if(condition) {
break LABEL;
}
// Remaining code.
}
同样,我确信有很多更好的替代代码,但这回答了问题的明确要求。