try{ ... } catch(Exception e){ ... } finally{ ... }
- try:是用來(lái)監(jiān)測(cè)可能會(huì)出現(xiàn)異常的代碼段。
- catch:是用來(lái)捕獲 try 代碼塊中某些代碼引發(fā)的異常析显,如果 try 里面沒(méi)有異常發(fā)生歧焦,那么 catch 也一定不會(huì)執(zhí)行。在 Java 語(yǔ)言中痪欲,try 后面可以有多個(gè) catch 代碼塊,用來(lái)捕獲不同類型的異常攻礼,需要注意的是前面的 catch 捕獲異常類型一定不能包含后面的異常類型业踢,這樣的話,編譯器會(huì)報(bào)錯(cuò)礁扮。
- finally:不論 try-catch 如何執(zhí)行知举,finally 一定是最后執(zhí)行的代碼塊瞬沦,所有通常用來(lái)處理一些資源的釋放,比如關(guān)閉數(shù)據(jù)庫(kù)連接雇锡、關(guān)閉打開(kāi)的系統(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)問(wèn)題屡江。
- 不要忽略異常,像上面的這段代碼只是加了catch赛不,但沒(méi)有進(jìn)行任何的錯(cuò)誤處理惩嘉,信息就輸出了,這樣在程序中出現(xiàn)問(wèn)題的時(shí)候踢故,根本找不到問(wèn)題出現(xiàn)的原因文黎。
異常處理對(duì)程序性能的影響
try {
// ...
int i = Integer.parseInt(null);
} catch (Exception e) {
}
異常處理固然好用,但不能濫用
- try-catch代碼段會(huì)產(chǎn)生額外的性能開(kāi)銷殿较,它往往會(huì)影響JVM對(duì)代碼的優(yōu)化耸峭,因此建議僅捕獲有必要的代碼段,盡量不要一個(gè)大的try包住整段的代碼淋纲。
- java每實(shí)例化一個(gè)Exception劳闹,都會(huì)對(duì)當(dāng)時(shí)的棧進(jìn)行快照,這是一個(gè)相對(duì)比較重的操作洽瞬。如果非常頻繁本涕,開(kāi)銷不可忽略。