Java 例外處理
異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時是可以避免的。
比如說,你的程式碼少了一個分號,那麼執行出來結果是提示是錯誤java.lang.Error;如果你用System.out.println(11/0),那麼你是因為你用0做了除數,會拋出java.lang.ArithmeticException的例外。
異常發生的原因有很多,通常包含以下幾個類別:
使用者輸入了非法資料。
要開啟的文件不存在。
網路通訊時連線中斷,或JVM記憶體溢位。
這些異常有的是因為使用者錯誤引起,有的是程式錯誤引起的,還有其它一些是因為物理錯誤引起的。 -
要瞭解Java異常處理是如何運作的,你需要掌握以下三種類型的例外:
##檢查性例外:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如要開啟一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
執行階段異常: 執行時期異常是可能被程式設計師避免的例外。與檢查性異常相反,運行時異常可以在編譯時被忽略。
錯誤: 錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當堆疊溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。
Exception類別的層次所有的例外類別是從java.lang.Exception類別繼承的子類別。 Exception類別是Throwable類別的子類別。除了Exception類別外,Throwable還有一個子類別Error 。 Java程式通常不捕獲錯誤。錯誤一般發生在嚴重故障時,它們在Java程式處理的範疇之外。 Error用來指示執行階段環境發生的錯誤。 例如,JVM記憶體溢位。一般地,程式不會從錯誤中恢復。 異常類別有兩個主要的子類別:IOException類別和RuntimeException類別。 在Java 內建類別中(接下來會說明),有大部分常用檢查性和非檢查性異常。
Java 內建異常類別Java 語言定義了一些異常類別在java.lang標準套件中。 標準運行時異常類別的子類別是最常見的異常類別。由於java.lang包是預設載入到所有的Java程式的,所以大部分從執行時期異常類別繼承而來的異常都可以直接使用。
Java根據各個類別庫也定義了一些其他的異常,下面的表中列出了Java的非檢查性異常。
# 說明 | |
---|---|
ArithmeticException | 當出現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。 |
ArrayIndexOutOfBoundsException | 用非法索引存取數組時拋出的異常。如果索引為負或大於等於陣列大小,則該索引為非法索引。 |
ArrayStoreException | 試圖將錯誤類型的物件儲存到一個物件數組時拋出的異常。 |
ClassCastException | 當試圖將物件強制轉換為不是實例的子類別時,拋出該異常。 |
IllegalArgumentException | 拋出的異常表示向方法傳遞了一個不合法或不正確的參數。 |
IllegalMonitorStateException | 拋出的異常表示某一執行緒已經試圖等待物件的監視器,或是試圖通知其他正在等待物件的監視器而本身沒有指定監視器的執行緒。 |
IllegalStateException | 在非法或不適當的時間呼叫方法時產生的訊號。換句話說,即 Java 環境或 Java 應用程式沒有處於請求操作所要求的適當狀態。 |
IllegalThreadStateException | 執行緒沒有處於請求操作所要求的適當狀態時所拋出的例外。 |
IndexOutOfBoundsException | 指示某排序索引(例如對陣列、字串或向量的排序)超出範圍時拋出。 |
NegativeArraySizeException | 如果應用程式試圖建立大小為負的數組,則拋出該異常。 |
NullPointerException |
當應用程式試圖在需要物件的地方使用 null 時,拋出該例外 |
NumberFormatException | 當應用程式試圖將字串轉換成一種數值類型,但該字串不能轉換為適當格式時,拋出該異常。 |
SecurityException | 由安全管理器拋出的異常,指示有安全侵犯。 |
StringIndexOutOfBoundsException |
此異常由 String 方法拋出,指示索引或為負,或超出字串的大小。 |
UnsupportedOperationException | 當不支援請求的操作時,拋出該異常。 |
下面的表中列出了Java定義在java.lang套件中的檢查性異常類別。
#說明 | |
---|---|
應用程式試圖載入類別時,找不到相應的類,拋出該異常。 | |
當呼叫 | Object 類別中的 clone 方法複製對象,但該物件的類別無法實作 Cloneable 介面時,拋出該例外。 |
拒絕訪問一個類別的時候,拋出該異常。 | |
當試圖使用 | Class 類別中的 newInstance 方法建立一個類別的實例,而指定的類別物件因為是一個介面或是一個抽象類別而無法實例化時,拋出該異常。 |
一個執行緒被另一個執行緒中斷,拋出該例外。 | |
請求的變數不存在 | |
請求的方法不存在 |
序號 | ##方法及說明 |
---|---|
public String getMessage()
傳回關於發生的異常的詳細資訊。這個訊息在Throwable 類別的建構子中初始化了。 | |
public Throwable getCause()
傳回一個Throwable 物件代表異常原因。 | |
public String toString()#
使用getMessage()的結果傳回類別的串級名字。 | |
public void printStackTrace()
印出toString()結果和堆疊層次到System.err,即錯誤輸出流。 | |
public StackTraceElement [] getStackTrace()#
傳回一個包含堆疊層次的陣列。下標為0的元素代表棧頂,最後一個元素代表方法呼叫堆疊的棧底。 | |
public Throwable fillInStackTrace()
用目前的呼叫堆疊層次填入Throwable 物件棧層次,加入到棧層次任何先前資訊。 |