第五章、異常處理
第一節、異常處理基礎
異常(Exception)是指運行時代碼序列中產生的異常情況。換句話說,異常是一個運行時錯誤(runtime error)。在不支持異常處理的計算機語言中,錯誤必須被手工的檢查和處理-----典型的是通過錯誤代碼的運用等等。
一個VB(visual basic)函數(function)的例子:
Private Function ShowMsg(number As Integer) ‘傳入Integer類型參數
On Error GoTo ErrHandle ‘ 當出現錯誤時跳到ErrHandle標籤處
‘ VB中使用單引號進行註釋
Dim str As String ‘ VB中使用Dim來聲明一個變量
Me.MousePointer = vbHourglass ‘設置當前窗口鼠標的形狀
str = "Hello World!" ‘ 設置字符串str的值
If (number = 10) Then ‘ 當傳入參數等於10時
MsgBox str ‘ 顯示str字符串
Else
MsgBox "參數不是10"
End If
On Error GoTo ErrHandle2 ‘第二處錯誤處理
MsgBox number / i ‘i 沒有被初始化,默認值是0
‘這裏產生一個除0錯誤
Exit Function ‘ 退出函數,如果沒有此語句就會運行
‘ 緊接着的錯誤處理的代碼
ErrHandle:
Me.MousePointer = vbDefault ‘設置鼠標爲默認形狀
MsgBox Err.number & Err.Description ‘當函數中出現錯誤時顯示錯誤編號和描述
Exit Function
ErrHandle2:
Me.MousePointer = vbDefault
MsgBox "這是第二處錯誤處理!"
End Function
上面是VB中一般的錯誤處理形式,VB中一般的錯誤處理代碼都是放在函數的最後。
而Java支持異常處理,在Java中,一個異常(Exception)就是一個對象,所有異常類型都是內置類java.lang.Throwable的子類。Throwable類在異常類層次結構的頂層,緊接着Throwable類下面的是把異常分成兩個不同分支的子類。一個分支是Exception,一個分支是Error。Exception類用於用戶程序可能捕捉的的異常情況,它也是你可以用來創建你自己用戶異常類型子類的類。Error類定義了在通常環境下不希望被程序捕獲的異常,常用於Java運行時系統來顯示與運行時系統本身有關的錯誤,它們通常是災難性的致命錯誤,不是你的程序可以控制的,堆棧溢出是這種錯誤的一例。
你可以將程序中你認爲可能會出現錯誤的地方加上異常處理。Java異常處理通過5個關鍵字控制:try、cach、throw、throws和finally。下面介紹try/catch/finally語句,通常形式是:
try{
//這裏包含你認爲可能會出現錯誤的代碼。
//如無問題則代碼會從上到下運行
//代碼運行時出錯則會拋出異常,
//可以直接用一個throw語句顯示拋出異常
//或調用一個拋出異常的方法
}catch(ExceptionType1 exOb){
//異常類型1 處理代碼,ExceptionType 是發生異常的類型
}catch(ExceptionType2 exOb){
//異常類型2 處理代碼
}
…. // try代碼塊後可以有多個catch 塊
finally{
//這個語句塊包含了離開try子句後總要執行的代碼
//(1)try塊代碼順利執行
//(2)由於break、continue或return語句而將要離開try塊
//(3)當上面的catch塊處理了異常
//(4)還有未被捕獲的異常
// 如果try塊中沒有調用System.exit()語句,在上面的各種情況下,
// finally代碼塊一定會被執行。
}
當我第一次看到Java中的try語句時,我只會一些C語言,也沒什麼編程經驗,於是我納悶了很久,爲什麼要try(嘗試)呢?那麼這段代碼會不會執行?後來才明白怎麼一回事,如果也有初學者不明白的話,你可以將try語句理解成: 嘗試執行後面的代碼,如果無錯誤則會順利通過,否則會尋找與錯誤匹配的catch語句,然後再執行catch內的錯誤處理代碼。
try後面跟多個catch塊時 ,當出現異常,每個catch子句被依次檢查第一個匹配的異常類型的子句被執行,其他catch子句被旁路。要注意的是,異常子類必須在它們任何父類之前使用,因爲運用父類的catch語句將捕獲該類型及其所有子類類型的異常。這樣,後面運行子類的catch語句將永遠不會到達。而且,Java中不能到達的代碼是一個錯誤。
try不能單獨使用,後面至少跟一catch子句或一finally子句;try語句可以被嵌套,也就是說一個try代碼塊內可以包含另一個try代碼塊。每次進入try語句,異常的前後關係都會被推入堆棧,如果一個內部的try語句不含特殊異常的catch處理程序,堆棧將彈出,下一個try語句的catch處理程序將檢查是否與之匹配,這個過程將繼續直到一個catch語句匹配成功,或者是直到所有的嵌套try語句被檢查完。如果沒有catch語句匹配,Java的運行時系統將處理這個異常。