Java學習資料-Java異常處理

四、Java異常處理java

4.1 Java異常概念數組

    Java異常是Java提供的用於處理程序中錯誤的一種機制。spa

    所謂錯誤是指在程序運行的過程當中發生一些異常事件(如:除0溢出,數組下標越界,所要讀取的文件不存在)。設計

    設計良好的程序應該在異常發生時提供處理這些錯位的方法,使得程序不會由於異常的發生而阻斷或產生不可預見的結果。對象

    Java程序的執行過程當中如出現異常事件,能夠生成一個異常類,該異常類封裝了異常事件的信息並將被提交給Java運行時的系統,這個過程稱爲拋出(throw)異常。繼承

    當Java運行時系統接收到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交給其處理,這一過程稱爲捕獲(catch)異常。事件

4.2 異常類型get

Throwable虛擬機

Error    Exception(IOException、RuntimeException)it

4.3 Java的內置異常

除了java.lang包裏定義的異常處理外,在其它java包中還有異常處理。其實,幾乎每一個java包裏都有相應的異常類來處理相應的異常,可是RuntimeException異常以及其派生的子類是不用處理的,多少從RuntimeException裏派生的異常均可以自動調用。注意:咱們在處理異常時,能夠用catch來捕捉異常,即在運行過程當中若是系統發現異常就會將其捕捉下來進行人爲的處理;也能夠用throw來拋出異常,即在運行過程當中某個語句出現了異常如找不到文件等,系統會自動拋出該異常而繼續向下運行程序。這兩種方式各有千秋,經過捕捉異常咱們能夠更清楚地瞭解程序運行中存在的異常,以便咱們更好的改進;拋出異常能夠保證程序的正常運行。但在此提醒你們仍是選擇catch異常,這樣若是這個軟件之後有什麼bug也好處理。給你們舉個例子,就像咱們的ATM機同樣,若是咱們在取錢過程當中程序運行出現異常,咱們固然是但願系統拋出異常,以便咱們向銀行反映狀況來解決咱們遇到的問題,這種方式就是catch異常的好處之一。同時,若是是拋出異常,系統會拋出一大堆專業的術語來,這樣用戶會怎樣想,你們能夠想象一下,若是一我的去取錢,忽然間屏幕上顯示一大堆咱們Java語言拋出異常時的專業術語,這個會怎麼想。因此,經過catch異常,咱們能夠修改異常提示語以便用戶更好地理解。咱們再以取錢爲例,若是咱們選擇程序拋出異常,若是一我的去取錢,忽然間程序運行出現異常,但這個異常被拋出了,但如今的問題是拋出後在不知不覺間你的銀行卡餘額變少了你會怎麼想。因此,建議你們在寫程序時儘可能選擇catch異常。

4.4 Java異常舉例

import java.io.*;


public class TestEx {

public static void main(String[] args) {

try {

System.out.println(2 / 0);

} catch (ArithmeticException ae) { // 本身定義的異常類對象名,系統將異常對象傳遞給ae裏面,ae至關於形參

System.out.println("出錯了");

ae.printStackTrace();// 經常使用的辦法:把錯誤的堆棧信息打印出來!系統默認也是打印誤的堆棧信息。

}

}

}

運行結果:

出錯了

java.lang.ArithmeticException: / by zero

at TestEx.main(TestEx.java:7)


4.5 異常的捕獲和處理 

在Java語言的異常處理機制裏面包括異常捕獲和異常處理兩部分。經過異常處理咱們能夠人爲地處理捕獲到的異常,固然也能夠經過相應的方法來處理。

捕獲並處理異常語句格式以下:

try {……; } //可能引起異常的語句

catch(Exception1 e1) {……; }//對異常進行處理

catch(Exception2 e2) {……; }

......

finally {......; } //異常處理結束前的執行程序體 

4.6 異常拋出 

4.6.1 throw語句

在Java語言中throw語句主動產生一個異常,當程序執行到throw語句時會拋出一個異常,而後將控制轉到一個相應的catch代碼塊。若是當前方法中沒有catch模塊,那麼Java虛擬機將控制轉到調用這個方法的上一個方法中的catch代碼塊中,若是這個方法中尚未catch模塊,Java虛擬機將繼續在方法的調用棧中向上傳遞控制直到找到能處理這個異常的catch模塊。throw拋出異常語句的通常形式爲:

throw new Exception("the program just throw an exception"); 

4.6.2 throws語句

throws關鍵字是用在方法聲明中,用來列出從方法中發出的、非起源於Error或Runtime Exception中的任何異常(從RuntimeExeeption類型派生的異常一般是能夠避免的類型,而從Error類型派生的異常一般與嚴重的系統問題有關)。可以主動引起異常的方法必須用throws來聲明。通常包含一個throws子句的方法聲明形式爲:

type method_name(parameter_list) throws exception_list{}

其中exception_list是該方法能夠引起的以逗號分隔的異常列表。 

4.6.3 finally語句 

finally關鍵字是緊跟在try/catch異常模塊以後的模塊。由於有時咱們想執行一段代碼,但在執行該段代碼以前出現了異常,若是出現異常這段代碼就不會被執行,但咱們又想執行該段代碼,因此就用到了finally關鍵字。使用finally關鍵字時,不管其前面的try語句和catch語句怎樣執行以及是否執行,finally語句都必須執行一次。因此,咱們把咱們想執行的代碼放在finally模塊裏就能夠保證即便出現異常也能執行。

4.7 自定義異常類 

雖然在Java的異常處理機制裏面有很強大的異常處理類,但對於某些特殊異常咱們仍是要本身來處理的,因此咱們就要自定義異常類。建立異常類的方法很簡單,只要定義Exception的一個子類就能夠實現。因爲Exception繼承自Throwable,所以自定義異常類能夠得到Throwable類中定義的方法,固然也能夠在自定義類中重載從Throwable類中繼承的某些方法。

4.8 異常應用的其餘問題

    必須先catch較小的異常,再catch大的。

    使用自定義的常通常有以下步驟:

a) 經過繼承java.lang.Exception類聲明本身的異常類。

b) 在方法適當的位置生成自定義異常的實例,並用throw語句拋出。

c) 在方法的聲明部分用throws語句聲明該方法可能拋出異常。

    異常一致性:重寫方法須要拋出與員方法所拋出異常類型一致異常或不拋出異常。

4.9 異常應用舉例:

import java.io.*;


public class TestEx {

public static void main(String[] args) {

FileInputStream in = null;

try {

in = new FileInputStream("myfile.txt");

int b;

b = in.read();

while (b != -1) {

System.out.print((char) b);

b = in.read();

}

} catch (IOException e) {

System.out.println(e.getMessage());

/*

* } catch (FileNotFoundException e) { e.printStackTrace();

*/

} finally {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

運行結果:

myfile.txt (系統找不到指定的文件。)

Exception in thread "main" java.lang.NullPointerException

at TestEx.main(TestEx.java:20)

相關文章
相關標籤/搜索