2014-05-22 54 views
0

我知道finally的用途是保证某些指令或清理代码得到执行。但是使用finally或在catch块之后放置代码的真正区别是什么。
我的意思是,给我一个例子,你需要使用finally,否则代码可能根本不会执行。关于finally块

+0

即使抛出并不捕获,或者捕获并重新抛出或返回,“finally”块也会执行。 '尝试{抛出新的错误(); } finally {“do somehting”}'仍然运行finally。 –

+0

我可以得到这些场景中的每一个的代码示例 –

回答

4

最后会执行catch块中发生的事情。有几种情况存在。

catch(Exception E) 
{ 
    ... 
    throw new OtherException(BetterMessage, E); 
} 

catch { return null; } 

catch { SomeMethodThatWillThrowAnException(); } 

因此,即使您返回或者抛出一个异常退出Catch块,你还是会执行finally块,而任何代码简单地在try-catch之后将被忽略。

+1

有'try {return; } ...也是如@Petros P建议的那样,以及'exit()'情况。 – Elist

0

即使抛出并捕获,最后一个块也会发射,无论发生什么。例如,如果您的catch可能导致进程结束或应用程序崩溃,则放在不在finally块中的catch之后的代码可能无法执行。

+0

我明白了。如果应用程序崩溃,我想运行什么样的代码?这实际上是我最感兴趣的 –

+0

确保在崩溃的某个地方记录某些事情。尝试提醒另一个有关失败的进程。保存任何用户数据,你仍然可以。尝试重新启动应用程序。无论你想要什么 - 这更多的是一个架构决定; FINALLY块绝对不是*永远*必需的,因为肯定有时候在上下文中没有用处。 – kyzen

0

无论是否引发异常,finally块都会执行。

你的问题是,使用finallycatch后面的区别是什么。如果抛出异常,catch块之后的代码将不会被执行。如果您将代码放在finally区块中,它将会。

0

可能会发生一些您不会捕获的异常。 finally块即使在引发意外的异常时也能保证其内部代码的执行。

1

终于执行不管什么。

一个例子

public void test() { 
    try { 
     int x = 0; 
     return; 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } finally { 
     System.out.println("Hello from finally"); 
    } 

    System.out.println("Hello from after catch"); 
} 

在这种情况下,“你好,从抓到底”将不被打印,但“你好,从最后”的意愿。