2019-04-29異常throw和try catch和finally的對比

java里的異常多種多樣,這是一種非常有用的機制,它能幫助我們處理那些我們未知的錯誤,在java里,關于異常的有throw throws,還有一個try catch 程序塊。接下來我們挨個看看這幾個的作用。

1.throw
throw 就是拋出一個異常,并獲取這個異常的引用,這個異常會被拋到外部的環(huán)境,由外部環(huán)境進行處理

class A{
    public void func() throws Exception{
        throw new Exception();
    }
}
這里拋出了一個Exception,Exception是throwable的子類,是所有異常的基類。與此同時,throwable還有另一個子類,也就是Error。

這里會把Exception這個引用拋到外部環(huán)境中去處理。

throw跟try...catch...finally的對比:

 

public class  ZeroTest {
    public static  void  main(String[] args) {
     try{
       int i = 100/ 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new  RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
  }
}
 
  try catch是直接處理,處理完成之后程序繼續(xù)往下執(zhí)行,throw則是將異常拋給它的上一級處理,程序便不往下執(zhí)行了。
本題的catch語句塊里面,打印完1之后,又拋出了一個RuntimeException,程序并沒有處理它,而是直接拋出,
 因此執(zhí)行完finally語句塊之后,程序終止了
 
   首先執(zhí)行try,遇到算術異常,拋出,執(zhí)行catch,打印1,然后拋出RuntimeException,緩存異常,執(zhí)行finally,打印2,然后拋出RuntimeException。
  如果catch中沒有拋出RuntimeException,則執(zhí)行結果為123。
 

2.throws
那我們就不得不說一下throws,其實throws并不是拋出一個實際的Exception而是一個異常聲明,它聲明這個方法可能會拋出一個異常,注意是可能,所以在沒有異常的情況下也是可以用throws的,而throws本身的作用也是用來提高程序的健壯性,反過來,如果這個方法的的確確的有一個異常,那么編譯器會強制讓你加上throws這個異常聲明。

通常throws是寫在參數列表的后面,這樣就表明這個方法有可能會拋出一個異常

class A{
    public void func() throws Exception{
        throw new Exception();
    }
    
    public void g() throws Exception{
        
    }
}
3.try...catch
當我們在其環(huán)境中調用func 和 g的時候,編譯器會通知我們需要用一個Try catch程序塊來處理這個異常。

這個程序塊分兩塊,第一塊是try{} ,第二塊是catch(exception的引用){}
try這個程序塊很有意思,因為它的名字很易懂,就是嘗試,嘗試能不能正常的走完整個作用域,如果不能則拋出一個異常。所以我們在try塊里經常放上可能會拋出異常的程序段。
而catch恰好就是處理try里拋出來的異常,其中catch的參數列表接收的是一個異常的引用,是throw拋出來的異常的引用,這樣我們就可以得到這個異常的對象,倒不如說我們是得到來了這個異常對象的引用,因為在java里,通常我們也只能通過引用來操縱對象。

PS:當 throw new RuntimeException的時候,不用throws

public class Main {
    public static void main(String[] args){
        A a = new A();
        try{
            a.func();
            a.g();
        }
        catch(Exception e){
            System.out.println("捕獲了一個異常");
        }
    }
}
我們捕獲了func 的異常,因為我們明確的指明func 會拋出一個異常throw new Exception();所以我們這里也會捕獲到,并去處理它,所以運行起來我們會看到控制臺上會打印“捕獲了一個異常”。

盡管g()沒有拋出任何的異常,編譯器還是要求我們要用try catch把它括起來,是因為它擁有一個throws 異常說明。


 

**下面是常見的幾種異常,供大家參考:

輸入輸出異常:IOException
算術異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException

操作數據庫異常:SQLException

文件未找到異常:FileNotFoundException
數組負下標異常:NegativeArrayException
數組下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
文件已結束異常:EOFException
字符串轉換為數字異常:NumberFormatException
方法未找到異常:NoSuchMethodException
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容