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

问题描述 投票:50回答:7

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

关于抛出一个自定义异常(命名为“Break Continue Exception”),我一直在想到它在catch处理程序中什么都不做。我确定这很扭曲。

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

java try-catch-finally
7个回答
47
投票

正确的方法可能是通过将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) {
    ...
}

28
投票

您总是可以使用循环结构中的break或aioobies答案中指定的标记break来完成此操作。

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

        }
    } while (false);
}

12
投票

各种方式:

  • return
  • breakcontinue在循环中
  • break在标签声明中标注(参见@ aioobe的例子)
  • break在转换声明中。

...

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

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

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


顺便说一句,return适用于你需要突破finally的情况。但你应该避免在return块中做finally,因为语义有点令人困惑,并且容易引起读者头疼。


7
投票

有几种方法可以做到:

  1. 将代码移动到一个新方法和return
  2. 将try / catch包装在do{}while(false);循环中。

2
投票

在catch块中的这个示例中,我更改了counter的值,它会在block时中断:

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

1
投票

如果没有return,它会怎么样finally


1
投票

这是我通常做的代码:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }
© www.soinside.com 2019 - 2024. All rights reserved.