當程序發生異常時,咱們指望:返回到一種安全狀態,並可以讓用戶執行一些其餘的命令;或者 容許用戶保存全部操做的結果,並以適當的方式終止程序。java
異常處理機制:程序的執行過程當中若是出現異常,會自動生成一個異常類對象,該異常對象將被提交給java運行時系統,這個過程成爲拋出(throw)異常。當Java運行時系統接收到異常對象時會尋找處理這一異常的代碼,並把當前異常對象交給它處理,這一過程稱爲捕獲(catch)異常。若是java運行時系統未能找到能夠捕獲異常的方法,則運行時系統將會終止,相應的程序也將退出。數組
全部的異常都是由Throwable繼承而來,但在下一層當即分解爲兩個分支:Error和Exception。安全
Error類層次結構描述了Java運行時系統的內部錯誤和資源耗盡錯誤。函數
Exception層次結構。這個層次結構又分解爲兩個分支:一個分支派生於RuntimeException;另外一個分支包含其餘異常。劃分兩個分支的規則是:由程序錯誤致使的異常屬於RuntimeException;而程序自己沒有問題,但因爲像I/O錯誤這類問題致使的異常屬於其餘異常。this
派生於RuntimeException的異常包含下面幾種狀況:spa
• 錯誤的類型轉換。指針
• 數組訪問越界。code
• 訪問空指針。對象
不是派生於RuntimeException的異常包括blog
• 試圖在文件尾部後面讀取數據。
• 試圖打開一個錯誤格式的URL。
• 試圖根據給定的字符串查找Class對象,而這個字符串表示的類並不存在。
「若是出現RuntimeException異常,那麼就必定是你的問題」
細節:
1、若是try中語句正確,將不會執行catch中的語句;若是try語句中發生異常,try中該語句後的語句將不會繼續執行,而是當即返回一個異常對象與catch中的異常對象進行匹配,若是匹配成功,將從catch後面就繼續執行(也就是說try中後面的語句不會被執行了);
2、能夠寫多個catch語句,注意他們的前後順序,子類必須在父類以前,不然父類型必定先於子類型被匹配,全部子類型就沒有機會執行了。JAVA編譯出錯。
3、finally語句塊是必須被執行的(由於finally子句的這個特性,因此通常將釋放資源,關閉鏈接的語句寫在裏面)。
4、若是try{}中有個return語句,那麼finally中的代碼是否被執行呢?答案是執行的,並且在return前執行。
int f(int n) { try{ System.out.println("n = "+n);//下一條是return語句,因此從這裏跳入finally語句,執行完finally語句後再執行下面的return語句 return n*n;//因爲先執行finally語句且函數被返回,此語句將不被執行了,若是finally中沒有return語句,將在執行finally後執行它。 }catch(Exception e){ } finally { System.out.println("do this?"); return n; } }