70

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

关于抛出一个自定义异常(将其命名为“BreakContinueException”),我一直很奇怪,该异常在其 catch 处理程序中没有任何作用。我敢肯定这是非常扭曲的。

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

4

6 回答 6

62

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

public void someMethod() {
    try {
        ...
        if (condition)
            return;
        ...
    } catch (SomeException e) {
        ...
    }
}

如果代码涉及大量局部变量,您还可以考虑使用break带标签的块中的 a,如Stephen C建议的那样:

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}
于 2011-06-30T11:37:22.170 回答
27

您始终可以使用break循环构造或breakaioobies 答案中指定的标签来执行此操作。

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

        }
    } while (false);
}
于 2011-06-30T11:36:12.387 回答
16

各种方式:

  • return
  • break或者continue在循环中
  • break在标记语句中进行标记(参见@aioobe 的示例)
  • break在 switch 语句中时。

...

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

在我看来,如果你只是想摆脱尝试/捕捉,“打破标签”是最自然(最不扭曲)的方式。但是对于从未接触过 Java 结构的新手 Java 程序员来说,这可能会让人感到困惑。

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


顺便说一句,return在您需要突破finally. 但是你应该避免return在一个finally块中做 a,因为语义有点混乱,并且容易让读者头疼。

于 2011-06-30T11:39:10.737 回答
7

有几种方法可以做到:

  1. 将代码移入新方法并return从中移出

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

于 2011-06-30T11:35:52.653 回答
3

这是我通常做的代码:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }
于 2013-08-28T16:11:58.183 回答
2

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

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
于 2013-03-12T09:18:53.857 回答