【发布时间】:2011-09-25 22:02:55
【问题描述】:
我需要一种从 try/catch 块的中间中断而不抛出异常的方法。 类似于 for 循环中的 break 和 continue 的东西。 这可能吗?
关于抛出一个自定义异常(将其命名为“BreakContinueException”),我一直很奇怪,该异常在其 catch 处理程序中没有任何作用。我敢肯定这是非常扭曲的。
那么,有什么我不知道的直接解决方案吗?
【问题讨论】:
我需要一种从 try/catch 块的中间中断而不抛出异常的方法。 类似于 for 循环中的 break 和 continue 的东西。 这可能吗?
关于抛出一个自定义异常(将其命名为“BreakContinueException”),我一直很奇怪,该异常在其 catch 处理程序中没有任何作用。我敢肯定这是非常扭曲的。
那么,有什么我不知道的直接解决方案吗?
【问题讨论】:
这样做的正确方法可能是通过将 try-catch 块放在单独的方法中来分解方法,并使用 return 语句:
public void someMethod() {
try {
...
if (condition)
return;
...
} catch (SomeException e) {
...
}
}
如果代码涉及大量局部变量,您还可以考虑使用标记块中的break,如Stephen C 所建议的那样:
label: try {
...
if (condition)
break label;
...
} catch (SomeException e) {
...
}
【讨论】:
void 以外的东西怎么办?
return 关键字之后放置一个表达式,并在方法的底部包含一个 return 语句。
您始终可以使用循环构造中的 break 或 aioobies 答案中指定的标记为 break 来完成此操作。
public static void main(String[] args) {
do {
try {
// code..
if (condition)
break;
// more code...
} catch (Exception e) {
}
} while (false);
}
【讨论】:
do ... while(false) 应该被认为是标签声明的糟糕替代品。
break 关键字打破时,该块被认为是“突然完成”。抛出异常时也是如此;一段代码将“突然”退出。这与“正常”完成/退出相反。 finally 块在它们各自的 try 块正常或突然完成时获得执行,因此执行实际上会转到 finally,如果它存在,就在你“中断”到的任何地方之前。
各种方式:
returnbreak 或 continue 在循环中时break 在标记语句中标记(参见@aioobe 的示例)break 在 switch 语句中。...
System.exit() ...虽然你可能不是这个意思。在我看来,如果您只是想摆脱 try/catch,“打破标签”是最自然(最不扭曲)的方式。但是对于从未接触过 Java 结构的新手 Java 程序员来说可能会感到困惑。
虽然标签不明确,但我认为将代码包装在 do ... while (false) 中以便您可以使用 break 是一个更糟糕的主意。这将使非新手和新手感到困惑。新手(和非新手!)最好了解带标签的语句。
顺便说一句,return 适用于您需要突破finally 的情况。但是您应该避免在finally 块中使用return,因为语义有点混乱,并且容易让读者头疼。
【讨论】:
有几种方法可以做到:
将代码移入新方法并从中return
将 try/catch 包装在 do{}while(false); 循环中。
【讨论】:
这是我通常做的代码:
try
{
...........
throw null;//this line just works like a 'break'
...........
}
catch (NullReferenceException)
{
}
catch (System.Exception ex)
{
.........
}
【讨论】:
try。您明确抛出异常。
在 catch 块中的这个示例中,我更改了计数器的值,它会在块中中断:
class TestBreak {
public static void main(String[] a) {
int counter = 0;
while(counter<5) {
try {
counter++;
int x = counter/0;
}
catch(Exception e) {
counter = 1000;
}
}
}
}k
【讨论】:
Exception 是不好的。