經過本章的學習能夠達到一下目標:java
item 瞭解異常的產生原理面試
掌握異常處理語句的基本格式bash
掌握throw和throws關鍵字的做用學習
能夠自定義異常spa
瞭解Exception與RuntimeException的區別code
瞭解斷言的做用orm
認識異常: 關於被除數不能爲0的說明: 被除數爲0在數學上的解法是無窮大,對於計算機來講,若是是無窮大,則意味着內存將所有被佔滿。 cdn
在java中異常處理的語句:對象
try{
//有可能出現異常的語句
int temp = i / j;//此處會產生異常
System.out.println("兩個數字相除結果: " + temp);
}catch (ArithmeticException e) { //異常類 異常對象
// TODO: 編寫異常的處理語句
System.out.println("出現異常來:" + e);
}catch (Exception e) {
// TODO: 編寫異常的處理語句
}finally {
//必定會運行的程序代碼
}
複製代碼
從程序的運行結果能夠清楚地發現,由於程序中加入了異常處理代碼,因此當有異常發生後,整個程序也不會由於異常的產生而中斷執行。blog
異常類的繼承結構
在整個java的異常結構中,實際上有兩個類最經常使用的類,分別是Exception和Error,這兩個類都是Throwable的子類, 以下圖:
Exception:通常表示的是程序中出現的問題,能夠直接使用try...catch處理。 Error:通常指的是JVM錯誤,程序中沒法處理。 通常狀況下,開發者習慣於將Exception和Error統稱爲異常,而算術異常、數字格式異常等都屬於Exception的子類。
java的異常處理機制
在整個java的異常處理中,實際上也是按照面向對象的方式進行處理,處理的步驟以下: 1.一旦產生異常,則首先會產生一個異常類的實例化對象。 2.在try語句中對此異常對象進行捕捉。 3.產生的異常對象與catch語句中的各個異常類型進行匹配,若是匹配成功,則執行catch語句中的代碼。
通常在開發時,無論出現任何異常時,均可以直接使用Exception進行處理,這樣會比較方便。
那麼問題來啦? 可不能夠直接使用Throwable? 首先使用Throwable捕獲異常,這在代碼中沒有任何問題,由於Throwable捕獲都範圍是最大的。但通常開發中是不會直接使用Throwable進行捕獲的,對於Throwable來講有Exception、Error兩個子類,Error類自己不須要程序處理,而程序中須要處理的只是Exception,因此不必使用Throwable。 對於一個程序來講,若是有多個異常最好分別進行捕獲,而不要直接使用Exception捕獲所有異常。
瞭解throws與throw關鍵字
在定義一個方法時可使用throws關鍵字聲明,使用throws聲明的方法表示此方法不處理異常,而交給方法的調用處進行處理,throws使用格式以下。
public 返回值類型 方法名稱(參數列表...) throws 異常類{}
複製代碼
注意:不要在主方法中使用throws。 主方法爲一切的起點,一切的操做也是主方法開始的。因此,若是在主方法中使用throws,則程序出現問題後確定交由JVM進行處理,將致使程序中斷。
throw關鍵字
與throw關鍵字不一樣的是,能夠直接使用throw關鍵字人爲地拋出一個異常,拋出時直接拋出異常類的實例化對象便可。
注意:finally語句塊的編寫要求
finally做爲異常的統一出口,因此在此語句塊的編寫中儘量不要出現像throw或return這樣的語句,這樣能夠避免沒必要要的問題出現。
Exception類與RuntimeException類
在java面試中常常會問Exception類與RuntimeException類的區別。 咱們來看下邊的代碼。
public static void main(String[] args) throws Exception{
String str = "123";
int temp = Integer.parseInt(str);
System.out.println(temp*temp);
}
複製代碼
咱們看一下parseInt方法
public static int parseInt(String s) throws NumberFormatException
複製代碼
方法throws 在聲明時使用throws關鍵字,可是在方法調用時並無使用try...catch進行處理,這是爲何呢?看一下NumberFormatException類的繼承關係,
Exception--RuntimeException--lllegalArgumentException--NumberFormatException
複製代碼
Exception在程序中必須使用try--catch進行處理。 RuntimeException能夠不使用try--catch進行處理,可是若是有異常產生,則異常將由JVM進行處理。 提示:對於RuntimeException的子類最好也使用異常處理機制。 雖然RuntimeException的異常能夠不用try...catch進行處理,可是若是一旦處理異常,則確定會致使程序中斷執行,因此,爲了保證程序在出錯後依然能夠執行,因此在開發代碼時最好使用try...catch的異常處理機制進行處理。
自定義異常類 在java中已經提供了大量的異常類,可是這些異常類有時也很難知足開發者的要求,因此用戶能夠根據本身的須要來定義本身的異常類。定義異常類只須要Exception類便可。
斷言
在JDK1.4以後,java中增長類斷言的功能。斷言是確定某一個結果的返回值是正確的,若是最終此結果的返回值是錯誤的,則經過斷言檢查確定會提示錯誤信息。斷言的定義格式以下
assert boolean 表達式
assert boolean 表達式:詳細的信息
複製代碼
開發中不提倡使用斷言。