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