如何在不抛出Java异常的情况下中断try/catch块

Bas*_*usa 54 java try-catch-finally

我需要一种方法来打破try/catch块的中间而不抛出异常.类似于break并继续for循环的东西.这可能吗?

关于抛出一个自定义异常(命名为"BreakContinueException"),我一直在做一些奇怪的事情,这个异常在catch处理程序中什么都不做.我确定这很扭曲.

那么,我不知道任何直接的解决方案?

aio*_*obe 47

正确的方法可能是通过将try-catch块放在单独的方法中来分解方法,并使用return语句:

public void someMethod() {
    try {
        ...
        if (condition)
            return;
        ...
    } catch (SomeException e) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果代码涉及许多局部变量,您也可以考虑使用break标记块中的a,如Stephen C所建议的:

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


dac*_*cwe 27

你总是可以使用break循环结构或breakaioobies answer中指定的标签来完成它.

public static void main(String[] args) {
    do {
        try {
            // code..
            if (condition)
                break;
            // more code...
        } catch (Exception e) {

        }
    } while (false);
}
Run Code Online (Sandbox Code Playgroud)

  • 这样做会不会运行try catch的finally {}块? (3认同)
  • IMO,`do ... while(false)`应该被认为是带标签声明的较差的选择。 (3认同)

Ste*_*n C 13

各种方式:

  • return
  • break或者continue在循环中
  • break 在标签声明中标记(参见@ aioobe的例子)
  • break 在switch语句中.

...

  • System.exit() ......虽然这可能不是你的意思.

在我看来,如果你只想摆脱尝试/捕获,"打破标签"是最自然(最少扭曲)的方式.但是从未遇到过Java构造的新手Java程序员可能会感到困惑.

但是虽然标签很模糊,但在我看来,将代码包装do ... while (false)在一起以便你可以使用a break是一个更糟糕的想法.这会使非新手和初学者感到困惑.新手(和非新手!)最好学习标签语句.


顺便说一句,return在需要突破的情况下工作finally.但是你应该避免return在一个finally块中进行,因为语义有点令人困惑,并且容易引起读者头疼.


Aar*_*lla 7

有几种方法可以做到:

  1. 将代码移动到新方法中并return从中移动

  2. 将try/catch包装在一个do{}while(false);循环中.