文章目錄 
 - 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