Java基礎之異常

版權聲明:本文爲純屬博主水文,讀者嘻哈一笑即可。 https://blog.csdn.net/iprettydeveloper/article/details/59540275

1. 異常的概述

  異常指不期而至的各種狀況,如:文件找不到、網絡連接失敗、非法參數等。異常是一個事件,它發生在程序運行期間,干擾了正常的指令流程。Java通 過API中Throwable類的衆多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例,描述了出現在一段編碼中的 錯誤條件。當條件生成時,錯誤將引發異常。

  Java異常類層次結構圖:
  這裏寫圖片描述

  在 Java 中,所有的異常都有一個共同的祖先 Throwable(可拋出),Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。可以有兩個角度來劃分異常:
  1. 程序無法處理的錯誤error VS 程序本身可以處理的異常exception
  2. 可查的異常(checked exceptions) VS 不可查的異常(unchecked exceptions)

2. Error VS Exception

  Error(錯誤):是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,因爲它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行時不允許出現的狀況。對於設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在 Java中,錯誤通過Error的子類描述。
  Exception(異常):是程序本身可以處理的異常。Exception 類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發的錯誤。例如,若試圖使用空值對象引用、除數爲零或數組越界,則分別引發運行時異常NullPointerException、ArithmeticException、ArrayIndexOutOfBoundException等等。

注意:異常和錯誤的區別是異常能被程序本身可以處理,錯誤是無法處理。

3. checked exceptions VS unchecked exceptions

  • checked exceptions:可查異常,編譯器要求必須處置的異常。正確的程序在運行中,很容易出現的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發生是可以預計的,而且一旦發生這種異常狀況,就必須採取某種方式進行處理。除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。
  • unchecked exceptions: 不可查異常,編譯器不要求強制處置的異常。包括運行時異常(RuntimeException與其子類)和錯誤(Error)。Exception分兩大類運行時異常和非運行時異常(編譯異常),程序中應當儘可能去處理這些異常。
    1. 運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度儘可能避免這類異常的發生。運行時異常的特點是Java編譯器不會檢查它,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
    2. 非運行時異常 (編譯異常):是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

4. 處理異常機制

  在 Java 應用程序中,異常處理機制爲:拋出異常,捕捉異常。
  拋出異常:當一個方法出現錯誤引發異常時,方法創建異常對象並交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼並執行。
  捕獲異常:在方法拋出異常之後,運行時系統將轉爲尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即爲合適 的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法並執行。當運行時系統遍歷調用棧而未找到合適 的異常處理器,則運行時系統終止。同時,意味着Java程序的終止。

  對於運行時異常、錯誤或可查異常,Java技術所要求的異常處理方式有所不同。由於運行時異常的不可查性,爲了更合理、更容易地實現應用程序,Java規定,運行時異常將由Java運行時系統自動拋出,允許應用程序忽略運行時異常。
  對於方法運行中可能出現的Error,當運行方法不欲捕捉時,Java允許該方法不做任何拋出聲明。因爲,大多數Error異常屬於永遠不能被允許發生的狀況,也屬於合理的應用程序不該捕捉的異常。
  對於所有的可查異常,Java規定:一個方法必須捕捉,或者聲明拋出方法之外。也就是說,當一個方法選擇不捕捉可查異常時,它必須聲明將拋出異常。
  能夠捕捉異常的方法,需要提供相符類型的異常處理器。所捕捉的異常,可能是由於自身語句所引發並拋出的異常,也可能是由某個調用的方法或者Java運行時 系統等拋出的異常。也就是說,一個方法所能捕捉的異常,一定是Java代碼在某處所拋出的異常。簡單地說,異常總是先被拋出,後被捕捉的。
  任何Java代碼都可以拋出異常,如:自己編寫的代碼、來自Java開發環境包中代碼,或者Java運行時系統。無論是誰,都可以通過Java的throw語句拋出異常。
  從方法中拋出的任何異常都必須使用throws子句;捕捉異常通過try-catch語句或者try-catch-finally語句實現。
  總體來說,Java規定:對於可查異常必須捕捉、或者聲明拋出。允許忽略不可查的RuntimeException和Error。

5. 常見異常

  在Java中提供了一些異常用來描述經常發生的錯誤,對於這些異常,有的需要程序員進行捕獲處理或聲明拋出,有的是由Java虛擬機自動進行捕獲處理。Java中常見的異常類:
runtimeException子類
  1. java.lang.ArrayIndexOutOfBoundsException
  數組索引越界異常。當對數組的索引值爲負數或大於等於數組大小時拋出。
  2. java.lang.ArithmeticException
  算術條件異常。譬如:整數除零等。
  3. java.lang.NullPointerException
  空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等
  4. java.lang.ClassNotFoundException
  找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之後找不到對應名稱的class文件時,拋出該異常。
  5. java.lang.NegativeArraySizeException 數組長度爲負異常
  6. java.lang.ArrayStoreException 數組中包含不兼容的值拋出的異常
  7. java.lang.SecurityException 安全性異常
  8. java.lang.IllegalArgumentException 非法參數異常
IOException
  1. IOException:操作輸入流和輸出流時可能出現的異常。
  2. EOFException 文件已結束異常
  3. FileNotFoundException 文件未找到異常
其他
  1. ClassCastException 類型轉換異常類
  2. ArrayStoreException 數組中包含不兼容的值拋出的異常
  3. SQLException 操作數據庫異常類
  4. NoSuchFieldException 字段未找到異常
  5. NoSuchMethodException 方法未找到拋出的異常
  6. NumberFormatException 字符串轉換爲數字拋出的異常
  7. StringIndexOutOfBoundsException 字符串索引超出範圍拋出的異常
  8. IllegalAccessException 不允許訪問某類異常
  9. InstantiationException 當應用程序試圖使用Class類中的newInstance()方法創建一個類的實例,而指定的類對象無法被實例化時,拋出該異常

6. 自定義異常

  使用Java內置的異常類可以描述在編程時出現的大部分異常情況。除此之外,用戶還可以自定義異常。用戶自定義異常類,只需繼承Exception類即可。
  在程序中使用自定義異常類,大體可分爲以下幾個步驟:
  (1)創建自定義異常類。
  (2)在方法中通過throw關鍵字拋出異常對象。
  (3)如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。
  (4)在出現異常方法的調用者中捕獲並處理異常。

備註:原文地址,請點擊此處!

7. 異常攔截器的實現

~待續~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章