java中的異常處理---捕獲異常或者拋出異常


一、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{
        釋放資源的代碼;
      }

 

 

 

    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM