“啊,你來了,我一直在找你呢。”
“發生了什麼事嗎?”
“沒有,但我們還在學習。”
“好的。我在聽。”
“我想告訴你更多關於異常的事情:”
“在 Java 7 中,通過添加多個 catch塊稍微擴展了try-catch結構。看這個例子:”
try
{
…
}
catch (IOException ex)
{
logger.log(ex);
throw ex;
}
catch (SQLException ex)
{
logger.log(ex);
throw ex;
}
try
{
…
}
catch (IOException | SQLException ex)
{
logger.log(ex);
throw ex;
}
“那麼現在我們可以編寫由 OR 運算符分隔的多個異常('|' 是二進制 OR)嗎?”
“對啊,這樣不是很方便嗎?”
“嗯。但是 catch 塊中的異常對象的類型是什麼?”
“畢竟,IOException 有它的方法,SQLException 也有它的方法。”
“異常類型將是它們共同祖先類的異常類型。”
“啊。也就是說,它很可能是Exeption或RuntimeException。那為什麼不直接寫catch(Exception e)呢?”
“有時單獨處理錯誤時,將它們分組很方便,將一些錯誤寫入日誌,重新拋出其他錯誤,並以其他方式處理其他錯誤。”
“換句話說,這個方案被認為解決了處理不同錯誤的重複 catch 塊的問題。”
“啊。我明白了。謝謝,艾莉。”
“這還不是全部。我想告訴你更多有關finally塊的信息。”
“你可能已經知道,這個塊總是被執行。”
“當我說總是時,我的意思是絕對總是。”
“例如:”
try
{
return 1;
}
finally
{
return 0;
}
“這裡在try塊中有一個return,在finally塊中有一個return。所以這個方法的返回值將是數字 0。”
“無論發生什麼,finally塊都會執行。它的return語句會用它自己的值覆蓋其他返回值。”
“我懂了。”
“但是,方法可以返回值或拋出異常。 ”
“所以,如果一個值在 try 塊中返回,但finally塊拋出異常,那麼結果將是一個異常。 ”
“如果在try塊中拋出異常但finally塊有 return 語句怎麼辦?”
“然後就好像這個方法正常工作了,並且返回了return語句中的值。
例子 | 結果 |
---|---|
|
0 |
|
運行時異常 |
|
0 |
|
異常 |
“可能無法執行 finally 方法的唯一原因是程序通過調用 System.exit ();方法立即終止。”
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
“我懂了。”
“請記住,所有這些話題通常都會在面試中被問到,所以你最好理解並記住它們。”
GO TO FULL VERSION