“啊,你來了,我一直在找你呢。”

“發生了什麼事嗎?”

“沒有,但我們還在學習。”

“好的。我在聽。”

“我想告訴你更多關於異常的事情:”

“在 Java 7 中,通過添加多個 catch塊稍微擴展了try-catch結構。看這個例子:”

Java 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Java 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

“那麼現在我們可以編寫由 OR 運算符分隔的多個異常('|' 是二進制 OR)嗎?”

“對啊,這樣不是很方便嗎?”

“嗯。但是 catch 塊中的異常對象的類型是什麼?”

“畢竟,IOException 有它的方法,SQLException 也有它的方法。”

“異常類型將是它們共同祖先類的異常類型。”

“啊。也就是說,它很可能是ExeptionRuntimeException。那為什麼不直接寫catch(Exception e)呢?”

“有時單獨處理錯誤時,將它們分組很方便,將一些錯誤寫入日誌,重新拋出其他錯誤,並以其他方式處理其他錯誤。”

“換句話說,這個方案被認為解決了處理不同錯誤的重複 catch 塊的問題。”

“啊。我明白了。謝謝,艾莉。”

“這還不是全部。我想告訴你更多有關finally塊的信息。”

“你可能已經知道,這個塊總是被執行。”

“當我說總是時,我的意思是絕對總是。”

“例如:”

最後使用示例
try
{
 return 1;
}
 finally
{
 return 0;
}

“這裡在try塊中有一個return,在finally塊中有一個return。所以這個方法的返回值將是數字 0。”

“無論發生什麼,finally塊都會執行。它的return語句會用它自己的值覆蓋其他返回值。”

“我懂了。”

“但是,方法可以返回值或拋出異常。

“所以,如果一個值在 try 塊中返回,但finally塊拋出異常,那麼結果將是一個異常

“如果在try塊中拋出異常但finally塊有 return 語句怎麼辦?”

“然後就好像這個方法正常工作了,並且返回了return語句中的值。

例子 結果
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
運行時異常
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
異常

“可能無法執行 finally 方法的唯一原因是程序通過調用 System.exit ();方法立即終止。”

例子
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

“我懂了。”

“請記住,所有這些話題通常都會在面試中被問到,所以你最好理解並記住它們。”