2016-01-18 44 views
0

看看下面的代碼。雖然catch子句本身引發異常,但finally塊的return語句會導致該異常被吞噬。即使catch塊中出現錯誤,該方法也會返回420。在java的finally子句中有返回語句是危險的嗎?

private static int foo() throws Exception 
{ 
    try { 
     throw new Exception("try"); 

    } catch (Exception ex) { 
     throw new Exception("catch"); 
    } finally { 
     String s = ""; 
     return 420; 
    } 


} 
+3

你已經描述了它的功能,你又有什麼問題?危險嗎? 「例外」是危險的嗎? –

+2

在此背景下定義「危險」。你所顯示的是合法的,如果返回語句放在try/catch/finally之後,結果會相同。這樣做沒有什麼壞處,所以說它是否「危險」是什麼意思? –

+1

這是保存。 https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – CyberAleks

回答

0

如果遇到異常情況,您應該返回其他內容。如果在最終返回語句中引發該異常的變量是使用,則例外情況僅有危險。試想一下:

int a; 
try{ 
//... 
}catch(Exception e){ 
//a throws an exception somehow 
}finally{ 
returns a; 
} 

當你對對方使用a這樣的:

a += 1; 

你得到一個危險異常

我的建議是這樣:

try{ 
//... 
}catch(Exception e){ 
//a throws an exception somehow 
returns -1; 
}finally{ 
returns a; 
} 

而在另一邊:

if(return_value == -1) // skip or do something else; 

這樣一來,你就不會得到對方一個不可預知的異常。

+0

@GeorgeMulligan如何? – Meinkraft

0

在你的情況下,它是安全的,但如果我們改變你的情況有點

private static FileReader foo() throws Exception{ 
    try { 
     throw new Exception("try"); 
    } catch (Exception ex) { 
     throw new Exception("catch"); 
    } finally { 
     return new FileReader("");//this may also throw something 
    } 
} 

現在,因爲我們沒有在文件系統中指定正確的路徑return new FileReader("");將拋出FileNotFoundException我們將失去捕獲部分new Exception("catch");引發的異常具有潛在的危險性。

0

最後返回是一個非常糟糕的主意。它不會僅隱藏自己拋出的異常,還會隱藏虛擬機錯誤,如堆棧溢出或內存不足錯誤。這些錯誤可以在任何時候拋出,包括當數據結構的關鍵不變量不成立時,並且不可能預測程序將執行什麼操作。