Java異常以及繼承的一些問題
http://blog.csdn.net/hguisu/article/details/6155636
https://www.cnblogs.com/skywang12345/p/3544168.html
https://www.cnblogs.com/cvst/p/5822373.html
類之間的關系
java異常類層次結構圖:
圖片參考來自: http://www.benchresources.net/exception-hierarchy-in-java/
- Throwable
Throwable是 Java 語言中所有錯誤或異常的超類。Throwable包含兩個子類: Error 和 Exception。它們通常用於指示發生了異常情況。Throwable包含了其線程創建時線程執行堆棧的快照,它提供了printStackTrace()等接口用於獲取堆棧跟蹤數據等信息。
- Exception
Exception及其子類是 Throwable 的一種形式,它指出了合理的應用程序想要捕獲的條件。
- RuntimeException
RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。編譯器不會檢查RuntimeException異常。例如,除數為零時,拋出ArithmeticException異常。RuntimeException是ArithmeticException的超類。當代碼發生除數為零的情況時,倘若既"沒有通過throws聲明拋出ArithmeticException異常",也"沒有通過try...catch...處理該異常",也能通過編譯。這就是我們所說的"編譯器不會檢查RuntimeException異常"!如果代碼會產生RuntimeException異常,則需要通過修改代碼進行避免。例如,若會發生除數為零的情況,則需要通過代碼避免該情況的發生!
- Error
和Exception一樣,Error也是Throwable的子類。它用於指示合理的應用程序不應該試圖捕獲的嚴重問題,大多數這樣的錯誤都是異常條件。和RuntimeException一樣,編譯器也不會檢查Error。
參考https://www.cnblogs.com/skywang12345/p/3544168.html
Java將可拋出(Throwable)的結構分為三種類型:被檢查的異常(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。
(01) 運行時異常
定義: RuntimeException及其子類都被稱為運行時異常。
特點: Java編譯器不會檢查它。也就是說,當程序中可能出現這類異常時,倘若既"沒有通過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會編譯通過。例如,除數為零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。
雖然Java編譯器不會檢查運行時異常,但是我們也可以通過throws進行聲明拋出,也可以通過try-catch對它進行捕獲處理。如果產生運行時異常,則需要通過修改代碼來進行避免。例如,若會發生除數為零的情況,則需要通過代碼避免該情況的發生!
(02) 被檢查的異常
定義: Exception類本身,以及Exception的子類中除了"運行時異常"之外的其它子類都屬於被檢查異常。
特點: Java編譯器會檢查它。此類異常,要么通過throws進行聲明拋出,要么通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當通過clone()接口去克隆一個對象,而該對象對應的類沒有實現Cloneable接口,就會拋出CloneNotSupportedException異常。被檢查異常通常都是可以恢復的。
(03) 錯誤
定義: Error類及其子類。
特點: 和運行時異常一樣,編譯器也不會對錯誤進行檢查。當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。按照Java慣例,我們是不應該是實現任何新的Error子類的!
覆蓋注意事項:
子類方法覆蓋父類方法時,子類的權限必須要大於等於父類的權限。
異常時覆蓋的注意事項:
- 子類在覆蓋父類方法時,父類方法拋出異常,那么只能拋出的異常只能拋出父類異常或父類異常的子類或不拋出異常。
- 如果父類拋出多個異常,那么子類只能拋出父類的子集。
- 如果父類的方法沒有拋出異常,那么子類覆蓋時決不能拋出,只有try。
(RuntimeException及其子類除外)
開始一直不理解為什么RuntimeException可以拋出,后來仔細看了異常它是運行時異常,編譯器不會對他檢查,可以拋出也可以不拋出。
再看看這個
看來那個原則對RuntimeException及其子類不適用。
看看接口:
public interface OneInterface {
void say() throws IndexOutOfBoundsException, TypeConstraintException,FileNotFoundException;
}
public class OneInterfaceImpl implements OneInterface {
public void say() throws ImagingOpException,BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException {
}
}
編譯還是能通過的。