JAVA完全參考手冊(第8版) 第10章 異常處理

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.