1、Throwable
1)Throwable是所有異常的超類,包含2個子類: error(錯誤)和exception(異常)。
2)Throwable包含了其線程創建時執行堆棧的快照,它提供了printStackTrace()方法用來跟蹤線程在執行中的獲取堆棧的信息。
2、Error
1) Error類及其子類。是指程序在運行中,由於系統或者JVM出現的異常,導致程序被終止產生的一類異常。
如: StackOverflowError 棧溢出錯誤。OutOfMemoryError 內存不足錯誤。
3、Exception
1) 程序本身可以捕獲並且可以處理的異常, Exception可分爲運行時異常和編譯時的異常。
運行時異常:
RuntimeException及其子類,表示JVM在運行期間可能出現的異常。JVM不會去檢查此類異常,比如說NullPointerException 空指針異常,ArrayIndexOutBoundException數組下標越界異常, ClassCastException 類型強制轉換異常。此類異常屬於非檢查異常。比如說,除0,會出現異常,我們應該通過代碼來進行調整。
編譯時異常:
Exception中除RuntimeException及其子類出現的異常稱爲編譯時異常。JVM會檢查此類異常,比如IOException,文件讀取異常,ClassNotFoundException(沒有找到指定的類的異常)。
處理方式:
1)通過throws在方法上聲明拋出。
2)通過try..catch..捕獲異常來進行處理。
4、檢查型異常與非檢查型異常
檢查型異常:
檢查型異常是編譯器必須要處理的一類異常,除RuntimeException及其其他子類的異常不處理,其他的異常都屬於檢查型異常,如果不處理那麼會編譯不通過。 需要在方法名throws出去,或者自己用try{}catch來處理此類異常。
非檢查型異常
非檢查型異常又稱爲運行時異常,所有RuntimeException及其子類的異常可以均表示爲運行時異常。 在程序運行中,由於自身邏輯而產生的一類異常,如NullPointerException, 下標越界異常。
5、 異常關鍵字
finally: finally關鍵字總是在try..catch之後執行,主要是起到回收資源的作用,如數據庫連接釋放等,如果在finally裏有return或者throw等終止方法的語句,那麼就不會跳回原方法執行,不處理throw的異常的話,會導致程序終止。
throw: throw關鍵字能夠捕獲到的異常,不處理並向上拋出,在方法裏會被throws關鍵字給捕獲到,在方法內部拋出一個Throwable類型的異常。任何java代碼可以通過throw來拋出異常。
throws: throws關鍵字一般聲明在方法上,用於可聲明的異常。
6、異常處理機制
java異常的處理機制可分爲: 捕獲異常、拋出異常、聲明異常。
注: 非檢查異常(error,RuntimeException及其子類)不可使用throws關鍵字拋出。
一個方法出現編譯時異常,就需要 try-catch/ throws 處理,否則會導致編譯錯誤。
7、常見的異常面試題
- Error 和 Exception 區別是什麼?
答: Error類型是 JVM相關錯誤,如系統崩潰、內存不足、棧溢出,等編譯器對此類錯誤進行檢測,一旦發生此類錯誤,應用程序會發生終止。
Exception是應用程序由於自身邏輯或者需要監測的異常造成的一類異常,通常遇到這種錯誤,應對其進行處理,使應用程序可以正常的進行。
- 運行時異常和一般異常(受檢異常)區別是什麼?
答: 運行時異常: 包含RuntimeException及其之類的一類異常,這類異常不會檢查。
受檢異常: JVM編譯器需要監測的一類異常,是Exception異常除掉RuntimeException及其之類的 一類異常,需要對其進行處理才能編譯通過,如IOException。
- JVM 是如何處理異常的?
答: 在一個方法中如果發生異常,這個方法會創建一個異常對象,並轉交給 JVM,該異常對象 包含異常名稱,異常描述以及異常發生時應用程序的狀態。創建異常對象並轉交給 JVM 的 過程稱爲拋出異常。可能有一系列的方法調用,最終才進入拋出異常的方法,這一系列方法 調用的有序列表叫做調用棧。JVM 會順着調用棧去查找看是否有可以處理異常的代碼,如果有,則調用異常處理代碼。 當 JVM 發現可以處理異常的代碼時,會把發生的異常傳遞給它。如果 JVM 沒有找到可 以處理該異常的代碼塊,JVM 就會將該異常轉交給默認的異常處理器(默認處理器爲 JVM 的一部分),默認異常處理器打印出異常信息並終止應用程序。
- final、finally、finalize 有什麼區別?
答: final 可以修飾類、方法、變量。final如果修飾類表示該類不能被繼承,如果修飾方法,表示該方法不能被重寫,若果修飾變量,表示該變量是常量,不能被重寫賦值。
finally 一般用來處理異常必須要處理的代碼塊,一般可用來釋放資源。
finalize 是jvm調用的一個方法,屬於Object類的一個方法,是垃圾回收器在執行垃圾回收之前必須執行的清理方法。