第7章 JAVA異常處理_第1頁
第7章 JAVA異常處理_第2頁
第7章 JAVA異常處理_第3頁
第7章 JAVA異常處理_第4頁
第7章 JAVA異常處理_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章異常處理7.1異常的基本概念

7.2異常類的繼承架構

7.3拋出異常

7.4編寫自己的異常類

7.1異常的基本概念

異常也稱為例外,是在程序運行過程中發(fā)生的、會打斷程序正常執(zhí)行的事件。下面是幾種常見的異常:

(1)算術異常(ArithmeticException)。

(2)沒有給對象開辟內存空間時會出現(xiàn)空指針異常(NullPointerException)。

(3)找不到文件異常(FileNotFoundException)。

所以在程序設計時,必須考慮到可能發(fā)生的異常事件,并做出相應的處理,這樣才能保證程序的正常運行。

7.1.1異常處理的目的

在沒有異常處理的語言中,必須使用if或switch等語句,配合所設想得到的錯誤狀況來捕捉程序中所有可能發(fā)生的錯誤。但為了捕捉這些錯誤,編寫出來的程序代碼中經常有很多if語句,有時即使這樣也未必能捕捉到所有的錯誤,而且這樣做勢必導致程序運行效率的降低。

Java的異常處理機制恰好改進了這一點,它具有易于使用,可自行定義異常類,處理拋出異常的同時不會降低程序的運行速度等優(yōu)點。因而在Java程序設計時,應充分地利用Java的異常處理機制,以增進程序的穩(wěn)定性,提高效率。7.1.2簡單的異常范例

Java本身已有相當好的機制來處理異常的發(fā)生。本節(jié)主要介紹Java是如何處理異常的。下例TestException7_1是一個錯誤的程序,它在訪問數(shù)組時,下標值已超過了數(shù)組下標所容許的最大值,因此會有異常發(fā)生。

【例7-1】TestException7_1.java。在編譯時程序不會發(fā)生任何錯誤,但是在執(zhí)行到第6行時會產生下列錯誤信息:

Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:10

atTestException7_1.main(TestException7_1.java:6)

錯誤的原因在于數(shù)組的下標值超出了最大允許的范圍。Java發(fā)現(xiàn)這個錯誤之后,便由系統(tǒng)拋出“ArrayIndexOutOf

BoundsException”這個種類的異常,用來表示錯誤的原因,并停止運行程序。如果沒有編寫相應的處理異常的程序代碼,則Java的默認異常處理機制會先拋出異常,然后停止程序運行。7.1.3發(fā)生異常時的處理

TestException7_1的異常發(fā)生后,Java便把這個異常拋了出來,可是拋出來之后沒有程序代碼去捕捉它,所以程序到第6行便結束,程序根本不會執(zhí)行到第7行。如果加上捕捉異常的程序代碼,則可針對不同的異常做妥善的處理。這種處理的方式稱為異常處理。

異常處理是由try、catch與finally三個關鍵字所組成的程序塊,其語法如下:上述語法是依據(jù)下列的順序來處理異常的:

(1)?try程序塊若有異常發(fā)生,則程序的運行便中斷,并拋出“異常類所產生的對象”。

(2)拋出的對象如果屬于catch括號內欲捕捉的異常類,則catch會捕捉此異常,然后進到catch的塊中繼續(xù)運行。

(3)無論try程序塊是否捕捉到異常,或者捕捉到的異常是否與catch括號中的異常相同,最后一定都會運行finally塊中的程序代碼。

(4)?finally的程序代碼塊運行結束后,程序再回到try-catch-finally塊之后繼續(xù)執(zhí)行。由上述過程可知,異常捕捉過程中做了兩個判斷:第一個是try程序塊是否有異常產生,第二個是產生的異常是否和catch括號內欲捕捉的異常相同。值得一提的是,finally塊是可以省略的。如果省略了finally塊不寫,則在catch塊運行結束后,程序跳到try-catch塊之后繼續(xù)執(zhí)行。根據(jù)這些基本概念與運行的步驟,可以繪制出如圖7-1所示的流程圖。

異常處理的語法格式中,“異常類”指由程序拋出的對象所屬的類,例如例7-1中出現(xiàn)的“ArrayIndexOutOfBoundsException”就屬于異常類的一種。至于有哪些異常類以及它們之間的繼承關系,本書后面小節(jié)將做更進一步的探討。下面的程序代碼加入了try與catch,使得程序本身具有捕捉異常與處理異常的能力。圖7-1異常處理的流程圖輸出結果:

數(shù)組超出綁定范圍!

這里一定會被執(zhí)行!

main()方法結束!

程序說明:

(1)第7行聲明一個名為arr的整型數(shù)組,并開辟了5個數(shù)據(jù)空間。

(2)第8行為數(shù)組中的第10個元素賦值,此時已經超出了該數(shù)組本身的范圍,所以會出現(xiàn)異常。發(fā)生異常之后,程序語句轉到catch語句中去處理,程序通過finally代碼塊統(tǒng)一結束。

(3)第5~9行的try塊用來檢查是否有異常發(fā)生。若有異常發(fā)生,且拋出的異常屬于ArrayIndexOutOfBoundsException類,則運行第10~13行的代碼塊。因為第8行所拋出的異常正是ArrayIndexOutOfBoundsException類,所以第12行會輸出“數(shù)組超出綁定范圍!”字符串。由本例可看出,通過異常機制,即使程序運行時發(fā)生問題,只要能捕捉到異常,程序便能順利地運行到最后,且還能適時地加入對錯誤信息的提示。

(4)第10行如果捕捉到了異常,則在catch括號內的異常類ArrayIndexOutOfBoundsException之后生成一個對象e,利用此對象可以得到異常的相關信息。下例說明了類對象e的應用。例7-3省略了finally塊,但程序依然可以運行。在第10行中,把catch后括號內的內容想象成方法的參數(shù),而e就是ArrayIndexOutOfBoundsException類的對象。對象e接收到由異常類所產生的對象之后,就進到第11行,輸出“數(shù)組超出綁定范圍!”這一字符串,而第12行則輸出異常所屬的種類,也就是java.lang.ArrayIndexOutOfBoundsException。java.lang正是ArrayIndexOutOfBoundsException類所屬的包。

7.1.4異常處理的方法

當異常發(fā)生時,通??梢杂脙煞N方法來處理:一種是交由Java默認的異常處理機制進行處理。采用這種處理方式時,Java通常只能輸出異常信息,接著便終止程序的運行。例如,TestException7_1的異常發(fā)生后,Java默認的異常處理機制會顯示:

Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:10

atTestException7_1.main(TestException7_1.java:6)

接著結束TestException7_1的運行。

另一種處理方式是自行編寫try-catch-finally塊來捕捉異常,如TestException7_2與TestException7_3。自行編寫程序代碼來捕捉異常最大的好處是:可以靈活操控程序的流程,且可做出最適當?shù)奶幚?。圖7-2繪出了異常處理機制的選擇流程。圖7-2異常處理的方法

7.2異常類的繼承架構

異??煞譃閮纱箢悾簀ava.lang.Exception類與java.lang.Error類。這兩個類均繼承自java.lang.Throwable類。圖7-3為Throwable類的繼承關系圖。從圖中可以看出,Java異常事件分為兩大類:一大類繼承Error類,另一大類繼承Exception類。圖7-3Throwable

類的繼承關系圖習慣上將Error與Exception類統(tǒng)稱為異常類,但這兩者本質上還是有所不同的。Error類專門用來處理嚴重影響程序運行的錯誤,可是通常程序設計者不會設計程序代碼去捕捉這種錯誤,其原因在于即使捕捉到它,也無法給予適當?shù)奶幚?,如Java虛擬機出錯就屬于一種Error。不同于Error類,Exception類包含了一般性異常,這些異常通常在捕捉到之后便可做妥善的處理,以確保程序繼續(xù)運行,如TestException7_2中所捕捉到的ArrayIndexOutOfBoundsException就屬于這種異常。從圖7-3所示的異常類的繼承關系圖中可以看出:Exception類擴展出數(shù)個子類,其中IOException、RuntimeException是較常用的兩種。RuntimeException即使不編寫異常處理的程序代碼,依然可以編譯成功,而這種異常必須在程序運行時才有可能發(fā)生。與RuntimeException不同的是,IOException一定要編寫異常處理的程序代碼才行,它通常用來處理與輸入/輸出相關的操作,如文件的訪問、網絡的連接等。當異常發(fā)生時,發(fā)生異常的語句代碼會拋出一個異常類的實例化對象,之后此對象與catch語句中類的類型進行匹配,然后在相應的catch中進行處理。

7.3拋出異常

前兩節(jié)介紹了try-catch-finally程序塊的編寫方法,本節(jié)將介紹如何拋出(throw)異常,以及如何由try-catch來接收所拋出的異常。拋出異常有下列兩種方式:

(1)在程序中拋出異常。

(2)指定方法拋出異常。

7.3.1在程序中拋出異常

在程序中拋出異常時,一定要用到throw這個關鍵字,其語法如下:

throw異常類實例對象;

從上述格式中可以看出,在throw后面拋出的是一個異常類的實例對象。

【例7-4】TestException7_4.java。程序說明:

(1)該程序是要計算a/b的值。因b是除數(shù),故不能為0。若b為0,則系統(tǒng)會拋出ArithmeticException異常,代表除到0這個數(shù)。

(2)在try塊中,利用第8行來判斷除數(shù)b是否為0。如果b=0,則運行第9行的throw語句,拋出ArithmeticException異常;如果b不為0,則輸出a/b的值。在此例中強制把b設為0,因此try塊的第9行會拋出異常,并由第13行的catch捕捉到異常。

(3)拋出異常時,throw關鍵字所拋出的是異常類的實例對象,因此第9行的throw語句必須使用new關鍵字來產生對象。7.3.2指定方法拋出異常

如果方法內的程序代碼可能會發(fā)生異常,且方法內又沒有使用任何代碼塊來捕捉這些異常,則必須在聲明方法時一并指明所有可能發(fā)生的異常,以便讓調用此方法的程序得以做好準備來捕捉異常。也就是說,如果方法會拋出異常,則可將處理此異常的try-catch-finally塊寫在調用此方法的程序代碼內。如果要由方法拋出異常,則方法必須采用下面的語法來聲明:

方法名稱(參數(shù)…)throws異常類1,異常類2,…

下例指定由方法來拋出異常,注意此處把main()方法與add()方法編寫在同一個類內。程序說明:

(1)第1~10行聲明一個Test類,此類中有一個add(inta,intb)方法,但在此方法后用throws關鍵字拋出一個Exception異常。

(2)第15行實例化一個Test對象t。

(3)在第16行調用Test類中的add()方法。

從上面的編譯結果可以看出,如果在類的方法中用throws拋出一個異常,則在調用它的地方就必須明確地用try-catch來捕捉。 7.4編寫自己的異常類

Java可通過繼承的方式編寫自己的異常類。因為所有可處理的異常類均繼承自Exception類,所以自定義異常類也必須繼承這個類。自己編寫異常類的語法格式如下:

可以在自定義異常類中編寫方法來處理相關的事件,甚至不編寫任何語句也可正常地工作,這是因為父類Exception已提供了相當豐富的方法,通過繼承,子類均可使用它們。程序說明:

(1)第1~8行聲明一個DefaultException

類,此類繼承自Exception類,所以此類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論