2016-05-17 20 views
0

這是一個非常愚蠢的問題,但我不明白結合使用catch和最後。據我知道的代碼之後的catch塊將被執行的異常是否會提高,那麼爲什麼使用爪哇嘗試抓住似乎毫無意義

try 
{ 
    doSomething(); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 
finally 
{ 
    doSomethingInFinally(); 
} 

代替

try 
{ 
    doSomething(); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

doSomethingInFinally(); 

?我總是看到人們使用第一種模式,但我認爲這是額外的代碼。

+3

嘗試從'doSomething();'拋出'Error',看看你的第二個代碼會發生什麼。 – Kayaman

+0

但是如果你會得到不是例外,但其他可拋類嗎?那麼你將不會捕獲它並且'doSomethingInFinally();'不會被執行。最後是最好的選擇是100%執行某些事情 –

回答

4

在有些情況下你的建議不工作

  • 目前根本沒有catch語句(該方法將不會繼續執行,如果拋出一個異常)的情況。

  • catch塊重新拋出異常。

  • try塊中有一個return語句。
  • catch語句不處理超類型異常(就像你的案例中的Throwable)。
0

因爲您將在中途停止執行您的try {}聲明。在您的finally中,您可能會擔心關閉文件手柄,插槽等。

+0

是的,但你也可以在finally塊之外做到這一點,不是嗎? – leqo

+0

是的,但假設數據不適合您的計算,因此會引發錯誤。您可能想要返回該函數(因爲從無到有計算一些東西毫無意義)。但不是在關閉文件句柄之前。 'finally'保證塊被執行,即使發生錯誤 – Yuri

0

我們幾乎從未捕獲(或應該捕獲)Exception。我們將捕獲Exception的子類。在這種情況下,如果在doSomething()引發的catch子句未處理的異常不會在第二個示例中執行,則doSomethingInFinally()將不會執行。

2

我能給出的最好解釋你是要你直接到java doc

0

從Java文檔:

這保證了即使發生意外 例外finally塊被執行。

並有後續

把清理代碼在finally塊始終是一個很好的做法, 即使沒有異常的預期。

這裏是一個簡單的場景,爲什麼最後是很重要的:

LeakableIO i; 
try{ 
    i = new LeakableIO(); 
    // do more 
}catch(MyException e){ 
    return null; 
} 

i.close() 

我們假設有這樣return執行一個錯誤,你認爲i.close()也將被稱爲是迴歸後?答案是不。

0

區別在於一個表單可能會錯過最後的東西。

doSomethingAfter幾乎總是被調用。唯一不會被調用的是doSomethingWithException引發異常。

public void test1() { 
    try { 
     doSomething(); 
    } catch (Exception e) { 
     doSomethingWithException(); 
    } 

    doSomethingAfter(); 
} 

doSomethingAfter總是被調用,不管發生什麼事。

public void test2() { 
    try { 
     doSomething(); 
    } catch (Exception e) { 
     doSomethingWithException(); 
    } finally { 
     doSomethingAfter(); 
    } 
} 

即使return不會停止它。再次doSomethingAfter總是被調用。

public void test3() { 
    try { 
     doSomething(); 
    } catch (Exception e) { 
     doSomethingWithException(); 
     return; 
    } finally { 
     doSomethingAfter(); 
    } 
} 
0
public int method1() 
{ 
    try 
    { 
     return 1; 
     doSomething(); 
    } 
    catch(Exception e) 
    { 
     return 0; 
     e.printStackTrace(); 
    } 
    finally 
    { 
     System.out.println("Hello user"); 
    } 
} 

在這種上述方法你好用戶將總是打印。因爲finally代碼塊中存在的代碼將始終執行。 基本上在JDBC中,finally塊用於關閉連接。