1、try & catch
異常是執行階段錯誤。可以由java運行時系統產生,也可以通過代碼手動產生。五個關鍵字try catch throw throws finally
try{ }
catch(ExceptionType1 e1){ ... }
catch(ExceptionType2 e2){ System.out.println(e2); }
...
finally{ }
所有異常類型都是內建類Throwable的子類。兩個分支,Exception類和Error類。Exception類有一個重要子類,RuntimeException;Error類定義了常規環境下不希望由程式捕獲的異常,由java運行時系統使用以指示運行時本身出現了某些錯誤,堆疊溢位是一個例子。
處理異常有兩個優點:允許修複錯誤和阻止程式自動終止。
一旦拋出異常,程式控制就會從try代碼塊轉移出來,進入到catch代碼塊中,但是不會“返回”到try代碼塊中去。執行完catch繼續進入整個try/catch代碼塊的下一行。catch子句的範圍被限定在由之前try語句指定的那些語句內。catch不能捕獲由另一條try語句拋出的異常,但是嵌套的try語句是例外!
不能為單條語句使用try。
多條catch語句。當拋出異常時,按順序檢查每條catch語句並執行類型和異常能夠匹配的第一條catch子句,並忽略其他catch語句,並繼續執行後面代碼。異常子類必須位於所有超類之前,使用了某個超類的catch語句會捕獲這個超類及其所有子類的異常。例如,ArithmeticException必須在Exception之前catch。
嵌套try語句。一條try語句可以位於另外一條try語句之中。每次遇到try語句異常的上下文就會被推入到堆棧中,如果內層的try語句沒有為特定的異常提供catch,堆棧就會彈出該try語句檢查下一條try語句的catch處理常式是否匹配,直到找到匹配的catch語句,或檢查完所有的try語句。當涉及方法調用時,可能會出現不明顯的try語句嵌套,可能在一個try代碼塊中包含了某個方法的調用,而在該方法內部又有另外一條try語句。
多重捕獲。catch(ArithmeticException |
ArrayIndexOutOfBoundsException e ) { ... }
2、throw
throw ThrowableInstance; //ThrowableInstance必須是Throwable或者其子類類型的對象。基本類型以及非Throwable類都不能用作異常。通過兩種方式可以獲得Throwable對象:catch子句中使用參數和使用new建立Throwable對象。
throw語句之後的執行流會立即停止,所有後續語句都不會執行。檢查最近的try代碼塊,匹配catch,類推。例如,
class ThrowDemo {
static void
demoproc() {
try {
thrownew NullPointerException("demo"); //構造了一個NullPointerException執行個體
} catch(NullPointerExceptione) {
System.out.println("Caught inside demoproc.")
throw e;
}
}
public static main(String args[]) {
try {
demoproc(); //不用建立對象
} catch(NullPointerExceptione) {
System.out.println(“Recaught: ” + e);
}
}
}
//輸出為:Caught inside demoproc.
Recaught:java.lang.NullPointerException:demo。
許多內建的java運行時異常至少有兩個建構函式:一個不帶參數,一個帶有一個字串參數。如果使用後者則參數指定了用來描述異常的字串。
3、throws
在方法聲明中提供throws語句。throws子句列出了方法可能拋出的所有異常類型,且必須聲明。否則會編譯時間錯誤。
type method_name(parameter-list) throws exception-list{ ... } //exception-list由逗號隔開。
4、finally
異常可能使方法比預期時間更早地返回,此時finally可以解決諸如檔案關閉(繞過異常機制)之類的問題。
不管是否拋出異常,都會執行finally代碼塊。不管是通過未捕獲的異常還是使用顯式的返回語句,都會在返回之前執行finally子句。
5、java的內建異常
java在java.lang中定義的未經過檢查的RuntimeException子類(共17個)
參考連結:http://www.cnblogs.com/qinqinmeiren/archive/2010/10/14/2151702.html
http://blog.sina.com.cn/s/blog_4d8498800100dcm3.html
NullPointerException - null 指標引用異常
ClassCastException - 類型強制轉換異常
EnumConstantNotPresentException 試圖使用未定義的枚舉值
IllegalArgumentException -
傳遞非法參數異常
IllegalMonitorStateException -
非法的監視操作,例如等待未鎖定的線程
IllegalStateException -
環境或應用程式處於不正確的狀態
IllegalThreadStateException -
請求的操作與當前線程狀態不相容
ArithmeticException - 算術運算異常
ArrayIndexOutOfBoundsException 數組索引越界
ArrayStoreException - 向數組中存放與宣告類型不相容對象異常
IndexOutOfBoundsException
- 下標越界異常
NegativeArraySizeException
- 建立一個大小為負數的數組錯誤異常
NumberFormatException - 數字格式異常
SecurityException - 安全異常
StringIndexOutOfBounds 試圖在字串邊界之外進行索引
TypeNotPresentException -
類型未找到
UnsupportedOperationException
- 不支援的操作異常
java在java.lang中定義的經檢查的異常
ClassNotFoundException 類未找到
CloneNotSupportedException 試圖複製沒有實現Cloneable介面的對象
IllegalAccessException 對類的訪問被拒絕
InstantiationException 試圖為抽象類別或介面建立對象
InterruptedException 一個線程被另一個線程中斷
NoSuchFieldException 請求的域變數不存在
NoSuchMethodException 請求的方法不存在
ReflectiveOperationException 與反射相關的異常子類
6、建立自己的異常子類
只需要定義Exception的子類即可。子類不需要實際實現任何內容——只要他們存在於類型系統中,既可以用作異常。
Exception類沒有為自己定義任何方法,當然它繼承了Throwable提供的方法(詳見連結:http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html)。Exception類定義了四個建構函式,其中兩個支援鏈式異常,另兩個如下:Exception()
Exception(String msg)
例,
class MyException extends Exception {private int detail;MyException(int a) {detail = a;}public String toString() {return "MyException[" + detail + "]";}}class ExceptionDemo {static void compute(int a) throws MyException {System.out.println("Called compute(" + a + ")");if(a > 10) throw new MyException(a);System.out.println("Normal exit");}public static void main(String args[]) {try {compute(1);compute(20);} catch(MyException e) {System.out.println("Caught " + e);}}}
編譯javac a.java,產生ExceptionDemo.class和MyException.class
運行java ExceptionDemo,結果如下:
Called compute(1)
Normal exit
Called compute(20)
Caught MyException[20]
7、鏈式異常
為異常關聯另一個異常,第二個異常描述第一個異常的原因。鏈式異常可以包含所需要的任意深度。
為了使用鏈式異常,想Throwable類添加兩個建構函式和方法:
Throwable(Throwable causeExc) Throwable(String msg, Throwable causeExc)
//causeExc是引發當前異常的異常,msg允許同時指定該異常描述。
Throwable getCause() Throwable initCause(Throwable causeExc)
//getCause()返回引發當前異常的異常,不存在則返回null,
//initCause()將causeExc和調用異常關聯到一起並返回對異常的引用,每個異常對象只能調用一次initCause();如果通過建構函式設定了引發異常,那麼就不能再使用initCause()進行設定。通常initCause()用於為不支援前面描述的兩個附加建構函式的遺留異常類設定原因。
於2013/04/10