2013-08-17 35 views
1
class Demo { 
    public static void main(String args[]) { 
     System.out.println("Start main"); 
     try { 
      //exceptional code 
      int x=43/0; 
     } catch(ArithmeticException e) { 
      e.printStackTrace(); 
     } finally { 
      System.out.println("final code"); 
     } 
     System.out.println("End main"); 
    } 
} 

我使用上面的代码来了解finally块的机制。在这种情况下,我观​​察到即使没有该catch块,finally块也会执行并显示发生异常。但我观察到的差异是,当不使用catch块时,不会打印“End main”。我想知道finally代码块执行的原因,即使异常不是通过使用catch子句来处理的。我想知道一个finally块的基本功能是什么。“finally”块的功能是什么?

+0

因为这就是它设计的目的。无论是否引发'Exception',都会保证调用'finally'块。看看[The finally block](http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html)了解更多详情 – MadProgrammer

+0

@ MadProgrammer-是它的一个很好的提示......我认为它是机制,我想确保我在想什么真的很幸福。 – Vbabey

+0

我会用它来清理在该函数中使用的系统资源,如文件关闭,数据库连接关闭等,所以无论您的程序结束,正常还是异常,资源都将被释放。 – Adi

回答

5

最后使用块来运行代码,而不管是否存在异常。最后总是执行一个相关的try块。

通常最后是用来关闭try块中打开的资源。最后这样做的原因是,无论是否有例外,我们都应该关闭resoruce。但是在Java 7中,如果您使用AutoCloseable资源的资源尝试,则实际上不需要担心这一点。

在你的代码中,finally的相关性除了学习终于如何工作之外什么都没有。

了解更多关于最后:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

,并从相同的链接一张纸条:

重要:finally块是为了防止资源 泄漏的关键工具。当关闭文件或以其他方式恢复资源时,将 代码放置在finally块中以确保资源总是被恢复为 。

如果您使用的是Java SE 7或更高版本,请考虑在这些情况下使用 try-with-resources语句,这些语句会在不再需要时自动释放系统资源 。

+2

只有当您要关闭的资源实现“AutoCloseable”时,Try-with-resource才可用。 – Makoto

+0

@Makoto谢谢Makato,现在明确提到:-) –

+0

@ Juned-你能告诉我一些有用的链接,关注上述主题,并让自己清楚try,catch和final块背后的真正概念吗? – Vbabey

1

无论在trycatch块发生,finally原因,确保*为您服务,将被处决。

*只有当你中断或中止当前Thread当它在try/catch块的运行的finally块将不会被执行。

这是一个更具体的docs

0

Java Tutorials

的finally块总是执行try块退出时。这可确保即使发生意外异常也能执行finally块。但是最后对于不仅仅是异常处理而言非常有用 - 它允许程序员避免由于返回,继续或中断而意外绕过清理代码。清理代码放在finally块中总是一个很好的做法,即使没有预期的例外情况。

因此,如果您必须保证正在执行的操作(例如somePrintWriter.close()),但仍想在此之前处理任何异常,则finally块将执行该操作。

0

在Java中使用try-catch-finally块或try-with-resources块来实现与C++中的对象终结器类似的功能。

虽然它们用于异常处理,但finally语句块最重要的功能可能是关闭或释放在try块中的代码执行期间已打开或创建的资源。

请注意,在Java中存在对象终结器(在时尚之后),但它们几乎不应该用于最终化对象......怪异的,呃?