文章目錄
- java.lang.Throwable
- java.lang.Error
- java.lang.Exception
- java.lang.RuntimeException
通常來講,Java中的異常會被分為三種:
- Error: 這種異常被設計成不被捕獲,因為這種異常產生於JVM自身。
- Runtime Exception: 運行時異常往往與環境有關,編譯時間無法檢查,並且可能發生的情況太廣泛,所以系統會去處理,程式不需要捕獲。
- 普通異常: 常見的異常大多屬於此類。
這裡的Java異常指直接繼承java.lang.Throwable的異常類,他們的結構如:
- java.lang.Throwable
- java.lang.Error
- java.lang.Exception
- java.lang.RuntimeException
java.lang.Throwablejava.lang.Throwable是Java中所有可以錯誤和異常的父類。這裡設計成父類而不是介面,我想部分原因可能是在Java誕生的早期,使用類繼承結構更為流行。但更重要的原因應該是由於Exception不適於設計為介面。介面重視的是實現方法,規則的描述,而Exception重視的是裡面含有的資訊以及類名等資訊。Throwable的子類一般含有兩個建構函式:空參數的建構函式和帶異常資訊String參數的建構函式。如果此類繼承自其它Exception類,又會多兩個建構函式:含Throwable參數的建構函式和含Throwable,描述資訊String兩個參數的建構函式。java.lang.Errorjava.lang.Error發生在應用程式不應該試圖捕獲的情況。Java程式不需要去throw或catch此類及其子類,因為這種異常不應該由應用程式處理,並且通常屬於abnormal的情況。java.lang.Exceptionjava.lang.Exception是指Java程式應該捕獲的異常。其中,java.lang.RuntimeException是其中一個特別的子類。java.lang.RuntimeExceptionJava程式應該捕獲,卻可以不去捕獲的一個異常。在大多數情況下,都不會去捕獲他,一個重要原因是這種異常可能發生的情況太普遍,幾乎每行代碼都會有RuntimeException的風險,因此反而無需去捕獲了。JDK文檔中的原話是:“A method is not required to declare in its
throws
clause
any subclasses of
RuntimeException
that might be thrown during the execution of the method but not caught.”java.lang.RuntimeException的直接子類有這些:
- AnnotationTypeMismatchException
- ArithmeticException
- ArrayStoreException
- BufferOverflowException
- BufferUnderflowException
- CannotRedoException
- CannotUndoException
- ClassCastException
- CMMException
- ConcurrentModificationException
- DataBindingException
- DOMException
- EmptyStackException
- EnumConstantNotPresentException
- EventException
- IllegalArgumentException
- IllegalMonitorStateException
- IllegalPathStateException
- IllegalStateException
- ImagingOpException
- IncompleteAnnotationException
- IndexOutOfBoundsException
- JMRuntimeException
- LSException
- MalformedParameterizedTypeException
- MirroredTypeException
- MirroredTypesException
- MissingResourceException
- NegativeArraySizeException
- NoSuchElementException
- NoSuchMechanismException
- NullPointerException
- ProfileDataException
- ProviderException
- RasterFormatException
- RejectedExecutionException
- SecurityException
- SystemException
- TypeConstraintException
- TypeNotPresentException
- UndeclaredThrowableException
- UnknownAnnotationValueException
- UnknownElementException
- UnknownTypeException
- UnmodifiableSetException
- UnsupportedOperationException
- WebServiceException
類設計時使用Exception的幾個最佳實務(讀Effective Java有感)在Effective Java的Item 58中,Java Exception被分為三類:Error,checked exception和runtime exception。在設計類時,這三種Exception這樣使用為佳:
- Error:用於JVM相關的錯誤,例如resource deficiences,invariant failures以及其他使JVM無法正常啟動並執行異常。
- Runtime Exception:用於編程錯誤,JDK內建的很多就是用於編程錯誤
- Checked Exception:用於可以恢複的異常。
由於Error通常用於JVM相關的錯誤,因此其他的unchecked exception都應該繼承自Runtime Exception