2011-06-30 20 views
46

我需要一种从try/catch块中间断开而不引发异常的方式。 与break相似并继续for循环的内容。 这可能吗?如何在不引发Java异常的情况下从try/catch块中断开

我一直在关于抛出一个自定义的异常(命名为“BreakContinueException”),它的catch处理程序中什么也不做。我相信这是非常扭曲的。

那么,我没有意识到任何直接的解决方案?

回答

42

正确的方式做到这一点可能是通过将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) { 
    ... 
} 
+0

@aioobe:如果该方法应该返回“void”以外的东西该怎么办? – Gruber

+0

@Gruber,我不认为我理解这个问题。在第一个代码片段中,你必须在'return'关键字后加一个表达式,并在方法底部包含一个return语句。 – aioobe

1

会怎么样return做的,如果没有finally

+2

一个单独的回报,显然不不仅仅是尝试/赶上了。 – aioobe

7

有几种方法可以做到这一点:

  1. 从中

  2. 移动代码到一个新的方法和return

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

27

您可以随时与来自循环结构,一个break或在aioobies回答指定的标记break做到这一点。

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

     } 
    } while (false); 
} 
+2

难道这样会跑try try的finally {}块吗? –

+0

@Basil Musa:是的! – dacwe

+1

IMO,'do ... while(false)'应该被认为是一个糟糕的替代标签语句。 –

12

各种方法:

  • return
  • breakcontinue当循环
  • break标记时,在标记声明(见@ aioobe的例子)
  • break在switch语句时。

...

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

在我看来,“突破标签”是最自然的(至少扭曲)的方式来做到这一点,如果你只是走出一个try/catch的。但是对于从未遇到过Java构造的新手Java程序员来说,这可能会让人困惑。

虽然标签不明显,但我认为将代码包装在do ... while (false)中以便您可以使用break是一个糟糕的主意。这会混淆非新手和新手。新手(和非新手!)更好地了解标记语句。


顺便说一句,return作品的情况下,你需要跳出finally的。但是,您应该避免在finally块中执行return,因为语义有点令人困惑,容易让读者头疼。

2

在此示例中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 
+0

1)问题是关于抛出一个尝试而不抛出异常。您在封面下抛出一个异常,并且对JIT编译器来说可能太难以优化。 2)捕捉“例外”是不好的。 –

2

这是代码中,我通常做:

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

1)这不是有效的Java。 2)问题是关于抛出一个'try'而不抛出异常。你*显式抛出一个异常。 –

相关问题