2013-08-17 67 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中存在對象終結器(在時尚之後),但它們幾乎不應該用於最終化對象......怪異的,呃?