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

时间:2011-06-30 11:34:05

标签: java try-catch-finally

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

我一直在讨论抛出一个自定义异常(命名为“BreakContinueException”)这个简单的东西在它的catch处理程序中没有做任何事情。我确信这是非常扭曲的。

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

7 个答案:

答案 0 :(得分: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) {
    ...
}

答案 1 :(得分:28)

您始终可以使用循环结构中的break或aioobies answer中指定的带标签的break来执行此操作。

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

        }
    } while (false);
}

答案 2 :(得分:12)

各种方式:

  • return
  • 在循环中
  • breakcontinue
  • break在标签声明中标注(请参阅@ aioobe的示例)
  • 在li语句中
  • break

...

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

在我看来,如果只是希望摆脱try / catch,那么“break to label”是最自然(最少扭曲)的方式。但对于从未遇到过Java构造的新手Java程序员来说,这可能会让人感到困惑。

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


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

答案 3 :(得分:7)

有几种方法可以做到:

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

  2. 将try / catch包裹在do{}while(false);循环中。

答案 4 :(得分: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

答案 5 :(得分:1)

如果没有return

finally会如何呢?

答案 6 :(得分:1)

这是我通常做的代码:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }