Java - 異常處理
阿新 • • 發佈:2017-11-19
一個 普通 throw oid 基類 語句 內容 推薦 出現 主要內容:
* Java 異常的概念。
* Java 異常的分類。
* 異常的捕獲和處理。
Q:Java 是如何對異常進行處理的?
A:Java 中定義了很多異常類,這些類對應了各種各樣可能出現的異常事件,Java 程序的執行過程中如果出現異常事件,會生成一個異常對象並將其提交給 Java 運行時系統,該異常對象封裝了該異常事件相應的信息,當 Java 運行時系統接收到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交其處理。
異常(Exception) :
* 指的是運行期出現在的錯誤,也就是當你程序開始執行以後,執行期出現的錯誤;而不是我們敲 javac 這時候出現的。
* 觀察錯誤的名字和行號最重要!!!並且要敢於調試!!!記住一句話:程序是調出來的!!!
異常的概念:
* Java 異常是 Java 提供的用於處理程序中錯誤的一種機制。
* 所謂錯誤是指在程序運行的過程中發生的一些異常事件(如:除 0 溢出、數組下標越界、所要讀取的文件不存在)。
* 設計良好的程序應該在異常發生時提供處理這些錯誤的方法,使得程序不會因為異常的發生而阻斷或產生不可預見的結果。
* Java 程序的執行過程中如出現異常事件,會生成一個異常對象,該異常對象封裝了異常事件的信息並將被提交給 Java 運行時系統,這個過程稱為拋出(throw)異常。
* 當 Java 運行時系統接收到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交其處理,這一過程稱為捕獲(catch)異常。
異常的分類:
* J2SDK 中定義了很多異常類,這些類對應了各種各樣可能出現的異常事件。
* 異常的根基類是 Throwable。
* Throwable 它有已知的兩個子類:Error、Exception。
* Exception 下有很多異常,其中有個特殊的異常叫:運行時異常(RuntimeException)
* 層級,如下簡要圖:
Throwable
/ \
Error Exception
/ / \
... ... RuntimeException
\
...
* 這些異常的區別:
** Throwable:叫做可被拋出的,任何事件,只要你從 Throwable 這兒繼承,你就可以用 throws 語句把它往外拋出。
*** Error:叫做系統的錯誤,由 Java 虛擬機生成並拋出,包括動態鏈接失敗、虛擬機錯誤等,程序對其不做處理;也就說 Java 虛擬機出錯了,你的程序處理不了,你也不用處理。
*** Exception:所有異常類的基類,其子類對應了各種各樣可能出現的異常事件,一般需要用戶顯式的聲明或捕獲;也就說你程序能夠處理的錯誤,可以捕獲(catch)它。
**** RuntimeException:一類特殊的異常,如除以 0 、數組下標越界等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大;因此由系統自動檢測並將它們交給缺省的異常處理程序(用戶可不必對其處理);也就說是經常出的一種錯誤,這種錯誤你可以捕獲它,也可以不捕獲它(我們通常不捕獲),不捕獲照樣能運行,只不過運行時出錯而已,因為出的太頻繁了,你老捕獲它程序會累死去,打個比喻,例:你開車在路上,每看到一個小石子你就下車去撿開,那你不累死去,所以不如直接壓過去就得了!
**** 普通的 Exception:叫做必須捕獲(catch)的 Exception, 要求你必須得捕獲它程序才能往前走,凡是看見方法後面寫了 throws 的,OK,這一類的異常你必須得捕獲或聲明拋出!
*** 打個比喻來說明 Error 與 Exception 的區別,例:你開車在山路上走,你車子爆胎了,這時你可以停下來修理(換胎),這個叫 Exception ,因為你能處理它,那麽如果是山塌陷了,你能處理嗎?你不能,這時就叫 Error,你處理不了。
異常的捕獲和處理:
* Java 的例外處理機制使得例外事件沿著被調用的順序往前尋找,直到找到符合該例外種類的例外處理程序。
* try 語句
** try {...} 語句指定了一段代碼,該段代碼就是一次捕獲並處理例外的範圍。
** 在執行過程中,該段代碼可能會產生並拋出一種或幾種類型的異常對象,它後面的 catch 語句要分別對這些異常做相應的處理。
** 如果沒有例外產生,所有的 catch 代碼段都被略過不執行。
* catch 語句
** 在 catch 語句塊中是對異常進行處理的代碼,每個 try 語句塊可以伴隨一個或多個 catch 語句,用於處理可能產生的不同類型的異常對象。
** 在 catch 中聲明的異常對象(catch(SomeException e))封裝了異常事件發生的信息,在 catch 語句塊中可以使用這個對象的一些方法獲取這些信息。
** 例如:
*** getMessage() 方法,用來得到有關異常事件的信息。
*** printStackTrace() 方法,用來 跟蹤異常事件發生時執行堆棧的內容。
* finally 語句
** finally 語句為異常處理提供一個統一的出口,使得在控制流程轉到程序的其他部分以前,能夠對程序的狀態作統一的管理。
** 無論 try 所指定的程序塊中是否拋出例外,finally 所指定的代碼都要被執行。
** 通常在 finally 語句中可以進行資源的清除工作,如:
*** 關閉打開的文件。
*** 刪除臨時文件。
*** ...
自定義異常:
* 使用自定義異常一般有如下步驟:
1、通過繼承 java.lang.Exception 類聲明自己的異常類。(也可以繼承其它的異常類,但不推薦,如果你繼承是的 java.lang.RuntimeException 異常類,則表示從你這個自定義的異常類裏拋出的異常也是可捕獲可不捕獲的!)
2、在方法適當的位置生成自定義異常的實例,並用 throw 語句拋出。
3、在方法的聲明部分用 throws 語句聲明該方法可能拋出的異常。
* 例子程序:
public class MyException extends Exception {
private int id;
MyException( String _message, int _id ) {
super( _message );
this.id = _id;
}
public int getId() {
return this.id;
}
public static void main(String[] args) throws Exception{
try {
if(args.length != 2) throw new MyException("username or userpassword is null!", 001);
if("null".equals(args[0])) throw new MyException1("username is null!", 002);
if("".equals(args[1])) throw new MyException("userpassword is null!", 003);
System.out.println("尊敬的黃金VIP:" + args[0] + ",歡迎您!");
} catch(MyException me) {
me.printStackTrace();
//System.out.println("Error");
}
}
}
註意:重寫方法需要拋出與原方法所拋出異常類型一致的異常,或者不拋出異常,其它的所有情況都不行,拋出的異常範圍大了不行,小了不行,個數不一樣也不行。
總結:
* 一個圖。
* 五個關鍵字。
* 先逮小的,再逮大的。
* 異常和重寫的關系。
Java - 異常處理