一、java的異常體系
Throwable
Error---錯誤。一般是由於jvm或者是硬件引發的問題,所以一般不會通過代碼去處理,可以看下硬件或者外部對接系統或中間件等問題
Exception----異常,一般是代碼中的問題,通過修改代碼去解決
二、異常的處理方式
異常的捕獲和異常的拋出
捕獲異常:
try{
可能出問題的代碼;
}catch(出現的異常類型 自定義變量){
處理異常的代碼
}
如下代碼:
public class ExcpetionDeal { public static void main(String[] args){ div(4,0); } public static void div(int a,int b){ int result = 0; try{ result = a/b; //這句代碼在b = 0時明顯不符合邏輯,可能會出現問題 }catch (ArithmeticException e){ //ArithmeticException是異常類型
e.printStackTrace(); //我們處理的方式就是打印出出問題的棧 }
System.out.println("result:"+result);
}
}
注意事項: 1、try{....}catch(){...} 中代碼如果出現了異常,程序不會阻塞,外面的程序會繼續執行下去
2、try后面可以使用多個catch,處理多個類型的異常類型,但是第一個catch中異常類型的包含范圍不能大於第二個catch中的類型(比如第一個catch異常類型是Exception,第二個catch中異常類型是ArithmeticException,Exception是一個總的 異常類,內部包括ArithmticException,這種情況下編譯會報錯)
3、如果try塊中的代碼出現了異常,則try中異常代碼后面的語句將不會被執行
拋出異常:
關鍵字:throw throws
public class Throw { public static void main(String[] args) throws Exception{ //main方法可以選擇拋出異常給jvm或者對異常進行捕獲處理 Div(4,0); } public static void Div(int a,int b) throws Exception{ //Div方法拋出異常給調用者main if (b==0){ throw new Exception(); } int result = a/b; System.out.println(result); } }
如上是當b = 0的時候對異常進行拋出的代碼。。
那么什么時候使用異常的捕獲,什么時候使用異常的拋出呢?
--------一般情況下,如果需要通知到調用者你的代碼出現了問題,這個時候使用拋出處理,如果代碼是與用戶直接打交道的異常,千萬不能再拋,再拋會拋給用戶了這個時候就使用捕獲處理了
Exception中並不是包含了所有的異常類型,現實生活中還有許多的異常類型未被定義,這個時候我們可能需要自定義一些異常類型,去完成異常的處理;
舉個例子:我要去吃一碗牛肉面,一萬10塊錢,當我錢不夠的時候怎么辦呢?這就相當於一種異常,我們需要事先定義一個異常類LessOfMoneyToEat
public class LessOfMoneyToEat extends Exception { 定義一個異常類,繼承自Exception類 public LessOfMoneyToEat(String message){ 定義一個都早方法傳入一些信息 super(message); } }
這種簡單的寫法其實就相當於自定義了一個異常類型,調用方法和其他異常類型調用方法是一樣的:
ublic class Main { public static void main(String[] args) throws LessOfMoneyToEat{ //直接拋出的寫法 int money = 9; /* 這里注釋的寫法是捕獲的寫法 try{ Eat(money); }catch(LessOfMoneyToEat e){ e.printStackTrace(); System.out.println("借點錢吃個飯。。。"); } */ Eat(money); } public static void Eat(int money) throws LessOfMoneyToEat{ if(money < 10){ throw new LessOfMoneyToEat("啊哦,錢帶少了。。。"); } System.out.println("吃地溝油木桶飯。。。"); } }
異常處理的時候有時候會使用到finally關鍵字
fanally塊:必須要有try才能使用
finally塊中的代碼在任何情況下都會執行的,除非退出java虛擬機
非常適合做釋放資源的工作,這樣子可以保證資源文件在任何情況下都被釋放。。。
認識了finally代碼塊之后,常用到的異常捕獲的格式其實會有三種:
第一種: 比較適用於有異常要處理,但是沒有資源要釋放的。
ry{
可能發生異常的代碼
}catch(捕獲的異常類型 變量名){
處理異常的代碼
}
第二種:比較適用於既有異常要處理又要釋放資源的代碼。
try{
可能發生異常的代碼
}catch(捕獲的異常類型 變量名){
處理異常的代碼
}finally{
釋放資源的代碼;
}
第三種: 比較適用於內部拋出的是運行時異常,並且有資源要被釋放。
try{
可能發生異常的代碼
}finally{
釋放資源的代碼;
}