2016-06-26 27 views
-4

在Java中,爲什麼 「終於」 塊存在:finally塊最後執行的原因是什麼?

try { 
    ... 
} catch(...) { 
    ... 
} finally { 
    // instructions lastly executed when the "try" block is quit 
} 

,而不是一個 「第一」 塊?

try { 
    ... 
} firstly { 
    // instructions firstly executed when the "try" block is quit 
} catch(...) { 
    ... 
} 
+1

什麼是'first'塊? – tkausl

+1

請詳細說明你的「第一個」塊 –

+0

「第一個」塊實際上不存在,我的問題是關於它不存在而不是「finally」塊的原因。 – Codoscope

回答

0

在Java中,爲什麼用「終於」塊存在:

一個finally塊的存在使得它(在trycatch始終執行無論身在何處Exception發生或根本不發生)。 finally是用來放置代碼,如關閉文件流,清理代碼等...

如果你不喜歡finally,那麼有try資源。你可能想要使用它。

在Java中,爲什麼存在「finally」塊而不是「first」塊?

,顧名思義finally必須包含清理代碼,它不能catch前放置和被調用一些花哨firstly。即使在catch塊中引發了Exception,也會執行finally中的代碼。

+0

恐怕那不是重點。即使在catch子句中引發異常,也會執行第一個塊。第一個塊可以包含清理代碼以及最後一個。 – Codoscope

+0

@ Qu'est-cet'yont那麼'finally'與'first'有什麼不同呢? –

+0

唯一的區別是第一個塊在catch子句之前執行,而不是在finally塊之後執行。因此,例如,它可以正確關閉資源,在catch塊(可以做一個System.exit ...)之前。 – Codoscope

1

這將是一樣

try { 
    try { 
     ... 
    } finally { 
     // instructions firstly executed when the outer "try" block is quit 
    } 
} catch(...) { 
    ... 
} 

這不是一個常見的模式,但如果是,它可以在一個更地道的方式予以支持。一般而言,finally用於關閉您不再需要的任何資源,並且您不太可能不希望在異常處理中阻止訪問這些資源。

唯一的區別是第一個塊在catch子句之前執行,而不是在finally塊之後執行。因此,例如,它可以正確關閉資源,在catch塊(可以做一個System.exit ...)之前。

我認爲資源的關閉更有意義放置在塊的末尾而不是中間。

+1

你明白了。但是,try塊中的局部變量不能在catch中使用。如果它們在外部聲明,它們可能爲空(因爲異常阻止它們在捕獲之前被初始化)。此外,資源可能會嘗試創建一個異常並且不能用於捕獲。順便說一句:最後會是一樣的:'嘗試{嘗試{...}趕上...}首先{...}'。 – Codoscope

+0

@ Qu'est-cet'yont我認爲你有一個觀點並且已經提出了你的問題,但我認爲這樣做並不合邏輯,儘管這可能是因爲我按照原樣使用。可能它以某種他們從中複製功能的語言以這種方式工作。 –

+0

謝謝。我給你的答案+1,因爲它帶來了一些答案(儘管它沒有完全解決)。我不明白爲什麼我會在這個問題上得到負面評價。 – Codoscope

相關問題