try{ ... } catch(Exception e){ ... } finally{ ... }
- try:是用來監(jiān)測可能會(huì)出現(xiàn)異常的代碼段。
- catch:是用來捕獲 try 代碼塊中某些代碼引發(fā)的異常,如果 try 里面沒有異常發(fā)生,那么 catch 也一定不會(huì)執(zhí)行。在 Java 語言中,try 后面可以有多個(gè) catch 代碼塊,用來捕獲不同類型的異常,需要注意的是前面的 catch 捕獲異常類型一定不能包含后面的異常類型,這樣的話,編譯器會(huì)報(bào)錯(cuò)。
- finally:不論 try-catch 如何執(zhí)行,finally 一定是最后執(zhí)行的代碼塊,所有通常用來處理一些資源的釋放,比如關(guān)閉數(shù)據(jù)庫連接、關(guān)閉打開的系統(tǒng)資源等。
需要注意的是 Java 虛擬機(jī)會(huì)從上往下匹配錯(cuò)誤類型,因此前面的 catch 異常類型不能包含后面的異常類型。
錯(cuò)誤試?yán)?/h4>
try {
// ...
int i = Integer.parseInt(null);
} catch (Exception e) {
}
- 盡量不要捕捉通用異常,也就像Exception這樣的異常,而是應(yīng)該捕獲特定異常,這樣更有助于你發(fā)現(xiàn)問題。
- 不要忽略異常,像上面的這段代碼只是加了catch,但沒有進(jìn)行任何的錯(cuò)誤處理,信息就輸出了,這樣在程序中出現(xiàn)問題的時(shí)候,根本找不到問題出現(xiàn)的原因。
異常處理對程序性能的影響
try {
// ...
int i = Integer.parseInt(null);
} catch (Exception e) {
}
異常處理固然好用,但不能濫用
- try-catch代碼段會(huì)產(chǎn)生額外的性能開銷,它往往會(huì)影響JVM對代碼的優(yōu)化,因此建議僅捕獲有必要的代碼段,盡量不要一個(gè)大的try包住整段的代碼。
- java每實(shí)例化一個(gè)Exception,都會(huì)對當(dāng)時(shí)的棧進(jìn)行快照,這是一個(gè)相對比較重的操作。如果非常頻繁,開銷不可忽略。