1. 程式人生 > >java中異常的理解

java中異常的理解

排序 leg ted 詳細 clas 訪問 基本 finally 返回

技術分享圖片

Trowable是所有異常的超類,對應的底下有兩個子類,Error和Exception,java中的異常其實總體上來說有三種類型:

一、檢查性異常,程序在編譯的時候出現的異常,例如打開一個文件,此時程序需要拋出FileNotFoundException等相關異常,簡單來說就是可預見的異常。

二、運行時異常,程序在運行時拋出的異常,與檢查性異常相反,運行時異常在編譯時是可以通過的,只有程序執行到異常代碼時才拋出異常,例如角標越界,空指針異常等等。

三、錯誤,錯誤和異常是不同,錯誤其實是脫離了程序員控制的問題,錯誤在代碼中經常被忽略。比如內存溢出,在編譯過程也是發現不了的

常用的非檢查性異常:

ArrayIndexOutOfBoundsException:用非法索引訪問數組時拋出的異常。如果索引為負或大於等於數組大小,則該索引為非法索引。

IllegalArgumentException:拋出的異常表明向方法傳遞了一個不合法或不正確的參數。

IndexOutOfBoundsException:指示某排序索引(例如對數組、字符串或向量的排序)超出範圍時拋出。

NullPointerException:當應用程序試圖在需要對象的地方使用 null 時,拋出該異常

NumberFormatException:當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。

常用的檢查性異常:

ClassNotFoundException:應用程序試圖加載類時,找不到相應的類,拋出該異常

NoSuchFieldException:請求的變量不存在

NoSuchMethodException:請求的方法不存在

異常中常用的方法:

異常中的方法其實平時開發的時候使用的比較少,默認的try catch中會有有e.printStackTrace();如果是自定義異常的話,可以初始化參數,通過定義的方法取值,下邊列舉一下基本方法:

public String getMessage() 返回關於發生的異常的詳細信息。這個消息在Throwable 類的構造函數中初始化了

public Throwable getCause() 返回一個Throwable 對象代表異常原因。

public void printStackTrace() 打印toString()結果和棧層次到System.err,即錯誤輸出流

public StackTraceElement [] getStackTrace() 返回一個包含堆棧層次的數組。下標為0的元素代表棧頂,最後一個元素代表方法調用堆棧的棧底。

捕獲異常:

try
{
   // 程序代碼
}catch(ExceptionName e1)
{
   //Catch 塊
}

程序中對需要保護的代碼,可以使用try-catch,當try 中的代碼塊有異常發生時,並且catch中包含對應的異常,那麽異常就會進入到catch 代碼塊中去,catch是可以進行
多重捕捉的,根據不同的異常匹配進入不同的catch塊中,有時候為了方便只用使用了Exception超類作為類型,只需要一個catch代碼塊

throws 和 thorw關鍵字的使用:

一個方法中,如果一個檢查性的異常沒有進行捕獲,那麽就需要在方法的尾部通過throws關鍵字將異常拋出,可一個自己手動的在代碼中使用throw 一個異常,throws後可以跟上多個異常,使用逗號隔開

finally 關鍵字的使用:

finally 中的代碼塊是在try之後執行,不管是否發生了異常,finally中的代碼塊都會執行,比如進行io流操作時,最終都會關閉流,一般都是放在finally中執行,即使發生異常了,流也要關閉,不然io資源一直被占用,造成了資源的浪費

try-catch-finally 使用的細節:

  • catch 不能獨立於 try 存在。
  • 在 try/catch 後面添加 finally 塊並非強制性要求的。
  • try 代碼後不能既沒 catch 塊也沒 finally 塊。
  • try, catch, finally 塊之間不能添加任何代碼

自定義異常:

一般項目開發中,根據業務的需要可能需要自己去定義不同的異常,如果說想定義一個檢查性的異常,就繼承Exception,如果想定義一個非檢查性的異常就繼承RuntimeException類,這裏其實有個坑,之前寫個需求,賬戶余額問題,不足的話拋出了一個自定義的異常,一開始繼承的是Exception,異常正常拋出,但是事物沒有回滾,後來查了下,spring aop 異常捕獲只對RuntimeException進行捕獲,所以改成RuntimeException事物正常回滾;

java中異常的理解