異常及其處理知識點_第1頁
異常及其處理知識點_第2頁
異常及其處理知識點_第3頁
異常及其處理知識點_第4頁
異常及其處理知識點_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、一 .異常處理概述1. 程序正常執行順序:逐語句順序執行 .2. 語句的正常完成和突然完成。3. 異常出現 .1 執行過程中出現錯誤時,系統會自動創建一個對象 (稱作異常對象,包含出錯信息 )并 且拋出這個對象,2 . 程序執行期間遇到無法繼續執行的情況,程序員可以創建一個異常對象,然后使用throw 語句拋出這個異常對象。4. 異常處理過程 .1)終止程序的正常執行順序,轉去查找處理該異常的代碼.查找策略:首先在當前函數查找,沒有找到則本方法結束,到調用該方法的方法中繼續查找, 如果一直查找到 main 方法也沒有找到處理該異常的代碼, 打印堆棧蹤跡后程序結 束。 2) .處理異常.如果在調

2、用鏈的某個方法中找到處理這個異常的代碼,則恢復程序正常執行狀態,執行這段代碼以及之后的代碼。二 .與異常有關的語句1 .throw expression 語句;2 .try-catch-finally 語句 三 .throwable 類及其子類throwableerrorexceptionruntimeexception檢查型異常= exception 及其子類 - runtimeexception 及其子類throwable 類的構造函數和方法構造函數throwable()throwable(string message)方法string getmessage()string getloca

3、lizedmessage()void printstacktrace()throwable fillinstacktrace()四. throws 子句 -方法定義的完整語法。1. 語法.方法修飾符結果類型 方法名(形參表) throws 子句 方法體throws 子句的語法是 throws異常類型名1,異常類型名n其中 throws 是 java 保留字,諸異常類型名是檢查型異常的名字。2. 對方法體的限制 .方法體中拋出的任何檢查型異常,無論是由 throw 語句拋出的還是由于調用其它方法而發生的檢查型異常,其類型都必須是throws 子句中列出的某個類型或其子類型。否則編譯期間出錯。 因

4、此,編譯器能夠保證:通過編譯的程序中的所有檢查型異常都得到了處理。3. 對方法重寫的限制 .子類重寫方法f,那么子類的f不能拋出比基類f更多的檢查型異常。但是允許重寫的f 拋出較少的檢查型異常,甚至不拋出任何檢查型異常。重寫子類方法時,如果允許子類方法拋出比基類方法更多的異常,那么將破壞“通過編譯的程序中的所有檢查型異常都得到了處理”這一事實。異常及其處理.一 .異常處理概述在運行過程中,應用程序可能遇到各種錯誤。例如,從一個已經關閉的流讀數據;訪問數組時數組下標越界;使用空引用調用方法等。許多程序員不檢查可能的錯誤,理由是如果每執行一個語句都檢查是否出錯,將使程序的結構混亂,難以理解。為了解

5、決程序的正確性和程序結構的清晰性之間的矛盾,程序設計語言引入了異常及異常處理機制。下面是java 語言的異常處理機制的粗略過程:1 .程序運行時出錯,拋出異常對象.當程序執行過程中出現錯誤(例如 0 做除數,數組下標越界等 )時,系統會自動創建一個對象(稱作異常對象,包含出錯信息)并且拋出這個對象,或者在程序執行期間遇到無法繼續執行的情況(例如打開文件失敗, 連接數據庫失敗等), 程序員可以創建一個異常對象,然后使用 throw 語句拋出這個異常對象。2 .終止程序的正常執行順序,轉去查找處理該異常的代碼.只要有異常對象e 被拋出(無論是由系統拋出的還是由 throw 語句拋出的),程序就立即

6、停止正常的執行順序,轉去查找處理異常對象e 的代碼。查找策略是首先在當前方法中查找,沒有找到則本方法結束,到調用該方法的方法中繼續查找,如果一直查找到 main 方法也沒有找到處理該異常的代碼, 打印堆棧蹤跡后 程序結束。3 .處理異常 .如果在調用鏈的某個方法中找到處理這個異常的代碼,則執行這段代碼以 及之后的代碼。 與異常處理有關的語句是throw 語句, try-catch-finally 語句和 throwable 類及其子類。二 . 與異常處理有關的語句 1. throw 語句 語法: throw expression;這里throw是保留字,expression是一個表達式, 它的

7、值一定是某個throwable類對象的引用。throw語句的功能是:計算表達式得到一個throwable對象的引用e,拋出e使得系統進入異常處理狀態,查找處理該類異常的 catch 子句。如果找到這樣的 catch 子句,系統恢 復到正常執行程序的狀態, 開始處理異常; 如果一直找不到處理該類異常的 catch 子句, 線 程終止。 例 .看下面代碼段/創建 throwable 對象,系統并不進入異常處理狀態throwable e=new throwable();其它代碼,系統正常執行這些代碼 if (b) throw e; /拋出異常,系統進入異常處理狀態,查找處理e 的代碼。else系統仍

8、舊處于正常執行程序的狀態,執行這些代碼。2. try-catch-finally 語句 語法 1:trystatements 稱作 try 塊catch(exception 類型 1 e1) statements_1 / 稱作 catch 塊catch(exception 類型 n en) statements / 稱作 catch 塊 語法2:trystatements 稱作 try 塊catch(exception 類型 1 e1) statements_1 / 稱作 catch 塊catch(exception 類型 n en) statements_n / 稱作 catch 塊 fin

9、ally statements / 稱作 finally 塊這里try, catch, finally者b是java語言的保留字。e1,e2,en是標識符。要特別注意,諸 catch子句的異常類型應該子類型在前,父類型在后,否則編譯出錯。因為父類型的catch會攔截子類型的異常對象,使子類型的catch永遠也不會起作用,成為不可抵達的代碼。try-catch語句的語義執行try塊執行finally塊執行finally塊try語句 因拋出v 突然完成try語句因原因 s突然完成。 (忘記拋出v)try-catch-finally 語句的語義例.package test_try;class mye

10、rror extends error /定義一個error 的子類myerror ()myerror (string s)super(s);public class test_trystatic void throw_error()/定義方法,它拋出error 或 exceptionthrow new myerror (zzzz);/ throw new nullpointerexception();public static void main(string args)try throw_error (); /調用拋出異常的方法catch (nullpointerexception e)/捕

11、獲并處理異常system.out.println(nullpointerexception);catch (exception e)/捕獲并處理異常system.out.println(exception);finally /finally 塊system.out.println(executing finally block.);第一個 throw 語句起作用時,程序的輸出。由于 myerror 繼承自 error ,因此兩個catch 子句都不能捕獲這個異常。test_try.myerror: zzzz /異常沒被捕獲。調用uncaughtexception() 方法,輸出堆棧蹤跡。at

12、test_try.test_try.throwerror(test_try.java:8)at test_try.test_try.main(test_try.java:13)executing finally block./此輸出表明 finally 塊一定執行。exception in thread main第二個 throw 語句起作用時程序的輸出。 這時異常得到處理,因此不會輸出堆棧蹤跡。processing nullpointerexceptionexecuting finally block.三 . 異常類throwable是所有異常類的超類。它只有兩個子類error和except

13、ion。error 類及其子類表示程序具有嚴重的錯誤,例如virtualmachineerror就是error的一個子類。exception 類表示程序的某種狀態,該狀態是應用程序希望捕獲的。exception類有為數眾多的子類,像loexception ,sqlexception ,nosuchfieldexception,nosuchmethodexceptionruntimeexception室室 寺寺。其中runtimeexception是exception的重要子類,它也有許多子類,像arithmeticexceptionclasscastexceptionnegativearray

14、sizeexceptionnullpointerexceptionindexoutofboundsexception檢查型異常.exception的子類,但不是 runtimeexception或其子類的所有異常類型統 稱為檢查型異常(checking exception);其它異常類型,即error及其子類型和 runtimeexception及其子類型統稱為非檢查型異常(unchecking exception)。關于檢查型異常這一名稱的來源,見方法定義中的throws子句。throwable類及其子類都是具體類,并且絕大多數類僅僅是名稱不同,所具有的方法都是繼承自throwable類。t

15、hrowable 類public class throwable extends object implements serializablethrowable類是所有errors和exceptions的超類。只有該類及其子類的對象可由java virtualmachine 或 throw 語句拋出。也只有該類及其子類可以做catch 子句的參數類型.throwable 類的實例用于指出異常情況已經出現,并且包含異常情況的相關信息。通常 throwable 類有兩個構造函數:一個無參數的構造函數,一個帶一個string 型參數msg的構造函數,參數 msg給出異常情況的詳細信息。throwab

16、le 類的對象包含兩類信息: 1.關于異常情況的信息 (一個串 )。 2.異常情況出現 時執行堆棧的狀態。 構造函數 throwable()構造一個throwable 對象,具有空錯誤消息的。throwable(string message)構造一個throwable 對象,其錯誤消息是message。方法string getmessage()返回當前 throwable 對象的錯誤消息。string getlocalizedmessage() 創建 throwable 類的更具專用色彩的描述信息。繼承throwable 類的子類應該重寫該方法,throwable 類的 getlocalize

17、dmessage()w getmessage(財能相同。 void printstacktrace() 打印該 throwable 對象的錯誤信息,并打印執行堆棧信息到標準錯誤流。具體打印形式與實現有關。java.lang.nullpointerexception第一行是 e.tostring()方法的結果,以下是堆棧信息at myclass.m2(myclass.java:9) 發生異常的語句所在方法名,文件名,行號at myclass.m1(myclass.java:6) 調用前一方法的方法名,文件名,行號at myclass.main(myclass.java:3) 以后同上這個例子由運

18、行如下程序產生1 class myclass 2 public static void main(string argv) 3 m1(null);4 5 static void m1(int a) 6 m2(a);7 8 static void m2(int b) 9 system.out.println(b0);10 11 throwable fillinstacktrace()把當前對象加入執行堆棧蹤跡,返回當前對象作為值。常用于重新拋出異常。例.1 package test_exception;2 public class test_exception 3 public static v

19、oid main(string args)4 5 f1();6 7 static void f1()8 f2 ();9 10 static void f2()11 try12 throw new nullpointerexception(aaaa);13 14 catch(nullpointerexception e)15 16 e.printstacktrace();17 nullpointerexceptione1=(nullpointerexception)e.fillinstacktrace();18 system.out.println(e=e1);19 e.printstacktr

20、ace();20 throw (nullpointerexception)e.fillinstacktrace();java.lang.nullpointerexception: aaaa /由第 16 行的 printstacktrace() 打印 at my_1.my_1_main.f2(test_exception.java:12)at my_1.my_1_main.f1(test_exception.java:8)at my_1.my_1_main.main(test_exception.java:5)java.lang.nullpointerexception: aaaa /由第 1

21、9 行的 printstacktrace() 打印 at my_1.my_1_main.f2(test_exception my_1_main.java:17) at my_1.my_1_main.f1(test_exception my_1_main.java:8) at my_1.my_1_main.main(test_exception my_1_main.java:5) java.lang.nullpointerexception: aaaa / 由第 20 行的 throw 引起 at my_1.my_1_main.f2(test_exception my_1_main.java:2

22、0) at my_1.my_1_main.f1(test_exception my_1_main.java:8) at my_1.my_1_main.main(test_exception my_1_main.java:5) true由第18行輸出,表明 e.printstacktrace()返回的就是 e。exception in thread main四. throws 子句 -方法定義的完整語法以前介紹的方法定義的語法是方法修飾符結果類型方法名(形參表)方法體方法定義的完整語法是方法修飾符結果類型方法名(形參表)throws 子句 方法體這里新增加的語法成分是throws 子句,它的語法

23、是throws異常類型名1,異常類型名n其中 throws 是 java 保留字, 諸異常類型名是檢查型異常的名字 (可以填寫非檢查型異常名,但它不會起任何作用) 。對方法體的限制 .方法體中拋出的任何檢查型異常,無論是由 throw 語句拋出的還是由于調用其它方法而發生的檢查型異常,其類型都必須是throws 子句中列出的某個類型或其子類型。否則編譯期間出錯。這意味著如果方法 f的throws子句是throws e1,em,那么如果f的方法體中有throw new e (“”)形式的語句,其中 e是檢查型異常,那么 e是 e1,em中的一個,或者是e1,em中某一個的子類。如果方法f調用方法

24、g,那么g的throws子句中的每個檢查型異常都必須是e1,,em之一或者是某個ek 的子類。否則要么方法 f 處理這個異常,要么編譯時出錯。并不要求方法f必須拋出throws子句列出的所有異常,而是說 f只能拋出throws子句列出 的檢查型異常。因此,編譯器能夠保證:通過編譯的程序中的所有檢查型異常都得到了處理。這就命名這類異常為“檢查型異常”的原因。對方法重寫的限制 .假設方法f () throws e1,em 是基類的一個方法。如果子類需要重寫方法f,那么f 不能拋出比基類 f 更多類型的檢查型異常, 它只能拋出 ek 或 ek 的子類型的異常。 但是允許重寫的 f 拋出較少的檢查型異常,甚至不拋出異常。重寫子類方法時,如果允許子類方法拋出比基類方法更多的異常,那么將破壞“通過編譯的程序中的所有檢查型異常都得到了處理”這一事實。例 .這個例子說明,一個方法拋出的檢查型異常必須是出現在throws 子句中列出的異常。public class test_checkedexception

溫馨提示

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

評論

0/150

提交評論