2013-07-31 60 views
8

這就是我想要做的事:Java - 如果我返回一個catch塊,finally塊會被執行嗎?

try { 

    //code 
} catch (Exception e) { 

    return false; 
} finally { 

    //close resources 
} 

將這項工作?這是不好的做法嗎?它會更好這樣做:

boolean inserted = true; 

try { 

    //code 
} catch (Exception e) { 

    inserted = false; 
} finally { 

    //close resources 
} 

return inserted; 
+6

試了一下自己? – Ankit

+0

dup警報!你嘗試搜索嗎?這已被問了幾次... – devnull

+0

@devnull我研究過,但我不知道這是否是一件好事。有些話題說是好的,而其他人則說這不是很好。 –

回答

20

是的,它會的。唯一能阻止finally塊執行的東西(AFAIR)是System.exit(),並且有一個無限循環(當然還有一個JVM崩潰)。

+7

...和停電:)(爆炸,你毀了它與添加JVM崩潰) – ppeterka

+0

但是,我的第一個例子是一個不好的做法? –

+2

這個有趣的位被很多人忽略了,'Thread#stop'將不會阻止'finally'執行。 –

5

finally塊執行總是無條件,爲try-catch-finally塊做的最後一件事。即使您對此執行了Thread#stopfinally塊仍會執行,就像正常的異常發生一樣。

不僅如此,如果您從finally返回,那麼返回值將會受到來自trycatch的回報的踐踏。

順便說一句你的第一個例子不是很好,但首選。在第二個例子中,讀者必須圍繞變量的任務進行追逐,這是一項乏味的工作,可以讓錯誤很容易地通過。

+1

我不同意'..btw'的一部分,我認爲最好只有一個返回語句,但是這使我在這裏找到了關於這個(返回的概念只來自哪裏)[http://程序員。 stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from] – nachokk

+1

這是一個很好的寫作! (第一個答案) –

4

兩者大致相同。但是,請注意以下情況:

int i = 0; 

try 
{ 
    //code 
} 
catch(Exception e) 
{ 
    return i; 
} 
finally 
{ 
    i = 1; 
} 

0是什麼會返回。

+0

然後我覺得我的例子不是一個好習慣,對吧? –

+0

@Thecoolguyacrossthestreet最好的做法是儘可能使用乾淨的代碼。 –

0

我只是想補充一點,在the specs描述:

如果catch塊的原因 - [R突然完成,則執行finally塊。

其中當然

的可以看出,那麼,return語句總是突然結束。

相關問題