在程序設計和運行的過程當中,發生錯誤是不可避免的。儘管 Java 語言的設計從根本上提供了便於寫出整潔、安全代碼的方法,而且程序員也儘可能地減小錯誤的產生,可是使程序被迫中止的錯誤的存在仍然不可避免。爲此,Java 提供了異常處理機制來幫助程序員檢查可能出現的錯誤,以保證程序的可讀性和可維護性java
異常(Exception)又稱爲例外,是一個在程序執行期間發生的事件,它中斷正在執行的程序的正常指令流。爲了可以及時有效地處理程序中的運行錯誤,必須使用異常類。錯誤可能產生於程序員沒有預料到的各類狀況,或者超出程序員可控範圍的環境,例如用戶的壞數據、試圖打開一個不存在的文件等。爲了可以及時有效地處理程序中的運行錯誤,Java 專門引入了異常類程序員
1、Java 內部錯誤發生異常,Java 虛擬機產生的異常。數據庫
2、編寫的程序代碼中的錯誤所產生的異常,例如空指針異常、數組越界異常等。這種異常稱爲未檢査的異常,通常須要在某些類中集中處理這些異常。數組
3、經過 throw 語句手動生成的異常,這種異常稱爲檢査的異常,通常用來告知該方法的調用者一些必要的信息。安全
Java 經過面向對象的方法來處理異常。在一個方法的運行過程當中,若是發生了異常,則這個方法會產生表明該異常的一個對象,並把它交給運行時的系統,運行時系統尋找相應的代碼來處理這一異常。咱們把生成異常對象,並把它提交給運行時系統的過程稱爲拋出(throw)異常。運行時系統在方法的調用棧中查找,直到找到可以處理該類型異常的對象,這一個過程稱爲捕獲(catch)異常。線程
在 Java 中全部異常類型都是內置類 java.lang.Throwable 類的子類,即 Throwable 位於異常類層次結構的頂層。Throwable 類下有兩個異常分支 Exception 和 Error設計
Throwable 類是全部異常和錯誤的超類,下面有 Error 和 Exception 兩個子類分別表示錯誤和異常。其中異常類 Exception 又分爲運行時異常和非運行時異常,這兩種異常有很大的區別,也稱爲不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)指針
Exception 類用於用戶程序可能出現的異常狀況,它也是用來建立自定義異常類型類的類。code
Error 定義了在一般環境下不但願被程序捕獲的異常。Error 類型的異經常使用於 Java 運行時由系統顯示與運行時系統自己有關的錯誤。堆棧溢出是這種錯誤orm
運行時異常都是 RuntimeException 類及其子類異常,如 NullPointerException、IndexOutOfBoundsException 等,這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理。這些異常通常由程序邏輯錯誤引發,程序應該從邏輯角度儘量避免這類異常的發生
非運行時異常是指 RuntimeException 之外的異常,類型上都屬於 Exception 類及其子類。從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。如 IOException、ClassNotFoundException 等以及用戶自定義的 Exception 異常,通常狀況下不自定義檢查異常。表 1 列出了一些常見的異常類型及它們的做用
Exception 異常層次結構的根類 RuntimeException 運行時異常,多數 java.lang 異常的根類 ArithmeticException 算術譜誤異常,如以零作除數 ArraylndexOutOfBoundException 數組大小小於或大於實際的數組大小 NullPointerException 嘗試訪問 null 對象成員,空指針異常 ClassNotFoundException 不能加載所需的類 NumberF ormatException 數字轉化格式異常,好比字符串到 float 型數字的轉換無效 IOException I/O 異常的根類 F ileN otF oundException 找不到文件 EOFException 文件結束 InterruptedException 線程中斷 IllegalArgumentException 方法接收到非法參數 ClassCastException 類型轉換異常 SQLException 操做數據庫異常
異常處理經過 5 個關鍵字來實現:try、catch、throw、throws 和 finally。try catch 語句用於捕獲並處理異常,finally 語句用於在任何狀況下(除特殊狀況外)都必須執行的代碼,throw 語句用於拋出異常,throws 語句用於聲明可能會出現的異常。在方法中用 try catch 語句捕獲並處理異常,catch 語句能夠有多個,用來匹配多個異常。
對於處理不了的異常或者要轉型的異常,在方法的聲明處經過 throws 語句拋出異常,即由上層的調用方法來處理
try{ //邏輯程序塊 } catch(ExceptionType1 e){ //處理代碼塊1 } catch (ExceptionType2 e){ //處理代碼塊2 throw(e); //再拋出這個"異常" } finally{ //釋放資源代碼塊 }
若是 Java 提供的內置異常類型不能知足程序設計的需求,能夠設計本身的異常類型。自定義異常類必須繼承現有的 Exception 類或 Exception 的子類來建立,其語法形式爲
<class><自定義異常名><extends><Exception>
自定義異常類通常包含兩個構造方法:一個是無參的默認構造方法,另外一個構造方法以字符串的形式接收一個定製的異常消息,並將該消息傳遞給超類的構造方法。
public class MyException extends Exception { public MyException() { super(); } public MyException(String str) { super(str); } } //使用 throw new MyException("異常信息!");