JAVA異常.ppt_第1頁
JAVA異常.ppt_第2頁
JAVA異常.ppt_第3頁
JAVA異常.ppt_第4頁
JAVA異常.ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

異常處理 目標(biāo) 簡介異常處理throw throws異常的繼承架構(gòu)總結(jié) 一個(gè)程序的編寫的過程中 避免程序執(zhí)行時(shí)的錯(cuò)誤 往往占了程序開發(fā)時(shí)程的絕大多數(shù)時(shí)間 對(duì)于避免程序執(zhí)行時(shí)的錯(cuò)誤 java提供了異常處理機(jī)制 在還沒有學(xué)習(xí)異常處理之前 如果您要編寫一個(gè)除法程序 并由使用者輸入除數(shù)與被除數(shù) 由于被除數(shù)除以0沒有意義 所以之前可能必須像以下這樣避免錯(cuò)誤 if b 0 system out println a b elsesystem out println 除數(shù)不能為0 這樣的方式過去在一些程序語言中會(huì)很常被利用 利用判斷條件來避免錯(cuò)誤的發(fā)生 然而這樣的方式會(huì)讓錯(cuò)誤處理與程序的處理邏輯混在一起 使得程序難以閱讀 而由于使用了一些判斷條件 即使有一些很少發(fā)生的錯(cuò)誤 也都必須一視同仁的進(jìn)行判斷檢查 這會(huì)使得程序的執(zhí)行效能受到一定程度的影響 java的異常處理機(jī)制可以協(xié)助我們捕捉程序執(zhí)行時(shí)期的錯(cuò)誤 它用來處理一些系統(tǒng)可以恢復(fù)的錯(cuò)誤 異常 exception 是java中定義的一種對(duì)象數(shù)據(jù)型態(tài) 在特定錯(cuò)誤發(fā)生時(shí)會(huì)丟出異常對(duì)象 我們可以捕捉這些異常并加以處理 避免程序可能的錯(cuò)誤發(fā)生 java的異常處理藉由 try catch finally 三個(gè)關(guān)鍵詞組合的語言來達(dá)到 其語法基本結(jié)構(gòu)如下 try 陳述句 catch 異常類型名稱 異常處理 finally 一定會(huì)處理的區(qū)塊 一個(gè) try 所包括的區(qū)塊 必須有對(duì)應(yīng)的 catch 區(qū)塊 它可以有多個(gè) catch 區(qū)域 而 finally 可有可無 如果沒有定義 catch 區(qū)塊 則一定要有 finally 區(qū)塊 建議 大家在編寫異常時(shí) 多使用finally importjava io publicclassuseexception publicstaticvoidmain string args try intinput bufferedreaderbuf newbufferedreader newinputstreamreader system in system out print 請(qǐng)輸入整數(shù) input integer parseint buf readline system out println inputx10 input 10 catch ioexceptione system out println i o錯(cuò)誤 catch numberformatexceptione system out println 輸入格式有誤 異常處理是程序在執(zhí)行但發(fā)生錯(cuò)誤并無法處理時(shí) 會(huì)丟出一個(gè)異常對(duì)象 在這個(gè)程序中 您特意使用bufferedreader取得輸入 當(dāng)使用bufferedreader類別時(shí) 若發(fā)生i o錯(cuò)誤會(huì)丟出ioexception異常 這個(gè)異常您必須處理 您試著從使用者輸入取得一個(gè)整數(shù)值 由bufferedreader對(duì)象所讀取到的輸入是個(gè)字符串 您使用integer類別的parseint 方法試著剖析該字符串為整數(shù) 如果無法解析 則會(huì)發(fā)生錯(cuò)誤并丟出一個(gè)numberformatexception異常對(duì)象 當(dāng)這個(gè)異常丟出后 程序會(huì)離開目前執(zhí)行的位置 而如果設(shè)定的 catch 有捕捉這個(gè)異常 則會(huì)執(zhí)行對(duì)應(yīng)區(qū)塊中的陳述句 注意當(dāng)異常一但拋出 就不會(huì)再回到異常的拋出點(diǎn)了 如果程序中設(shè)定有 finally 區(qū)塊 則無論異常是否有發(fā)生 則一定會(huì)執(zhí)行 finally 區(qū)塊中所定義的陳述句 finally 區(qū)塊使用時(shí)機(jī)的例子之一 就是當(dāng)您開啟了某個(gè)文件時(shí) 在讀 寫的過程中發(fā)生錯(cuò)誤 在使用 catch 區(qū)塊處理相對(duì)應(yīng)的異常之后 最后在 finally 區(qū)塊中定義一些關(guān)閉文件的動(dòng)作 讓關(guān)閉文件的動(dòng)作一定會(huì)被執(zhí)行 使用異常處理的好處是您可以將程序邏輯與錯(cuò)誤處理分開 使得程序易于編寫 閱讀與維護(hù) 由于異常處理是在程序執(zhí)行時(shí)發(fā)生錯(cuò)誤 而沒有辦法處理之時(shí)才產(chǎn)生異常對(duì)象 所以與使用判斷式來避免異常的方式比起來 異常處理會(huì)有比較好的執(zhí)行效能 當(dāng)程序發(fā)生錯(cuò)誤而無法處理的時(shí)候 會(huì)拋出對(duì)應(yīng)的異常對(duì)象 除此之外 在某些時(shí)刻 您可能會(huì)想要自行拋出異常 例如在異常處理結(jié)束后 再將異常拋出 讓下一層異常處理區(qū)塊來捕捉 若想要自行拋出異常 您可以使用 throw 關(guān)鍵詞 并生成指定的異常對(duì)象 例如 thrownewarithmeticexception 舉個(gè)例子來說明 在java的除法中 允許除數(shù)為浮點(diǎn)數(shù)0 0 所得到的是infinity 即無窮數(shù) 如果您想要自行檢驗(yàn)除零錯(cuò)誤 可以自行丟出異常 最接近這個(gè)條件的是arithmeticexception 當(dāng)除數(shù)為整數(shù)且為0時(shí) 就會(huì)引發(fā)這個(gè)異常 您可以如下拋出異常 publicclassusethrow publicstaticvoidmain string args doubledblzero 0 0 try system out println 浮點(diǎn)數(shù)除以零 100 dblzero if dblzero 0 thrownewarithmeticexception catch arithmeticexceptione system out println 發(fā)生除零異常 每個(gè)異常都必須有一個(gè) catch 區(qū)塊來捕捉 在try catch時(shí) 必須注意該異常是由何者引發(fā)并由何者捕捉 publicclassusethrow publicstaticvoidmain string args try try thrownewarrayindexoutofboundsexception catch arrayindexoutofboundsexceptione system out println arrayindexoutofboundsexception 內(nèi)層try catch thrownewarithmeticexception catch arithmeticexceptione system out println 發(fā)生arithmeticexception catch arrayindexoutofboundsexceptione system out println arrayindexoutofboundsexception 外層try catch 在這個(gè)程序中 arrayindexoutofboundsexception由內(nèi)層try catch丟出并捕捉 由于內(nèi)層已經(jīng)捕捉了異常 所以外層的try catch中之a(chǎn)rrayindexoutofboundsexception并不會(huì)捕捉到內(nèi)層所丟出的異常 但如果內(nèi)層的try catch并沒有捕捉到這個(gè)異常 則外層try catch就有機(jī)會(huì)捕捉這個(gè)異常 例如 publicclassusethrow publicstaticvoidmain string args try try thrownewarrayindexoutofboundsexception catch arithmeticexceptione system out println arrayindexoutofboundsexception 內(nèi)層try catch thrownewarithmeticexception catch arithmeticexceptione system out println 發(fā)生arithmeticexception catch arrayindexoutofboundsexceptione system out println arrayindexoutofboundsexception 外層try catch 程序中會(huì)定許多方法 method 這些方法中可能會(huì)因某些錯(cuò)誤而引發(fā)異常 但您不希望直接在這個(gè)方法中處理這些異常 而希望調(diào)用這個(gè)它的方法來統(tǒng)一處理 這時(shí)候您可以使用 throws 關(guān)鍵詞來聲明這個(gè)方法將會(huì)拋出異常 例如 privatevoidarraymethod int arr throwsarrayindexoutofboundsexception arithmeticexception 操作 注意如果會(huì)拋出多種可能的異常時(shí) 中間使用逗點(diǎn)分隔 當(dāng)有方法上使用 throws 聲明異常時(shí) 意味著調(diào)用該方法的調(diào)用者必須處理這些異常 而被調(diào)用方法可以保持程序邏輯的簡潔 下面這個(gè)范例是 throws 的一個(gè)簡單示范 publicclassusethrows publicstaticvoidmain string args try throwstest catch arithmeticexceptione system out println 捕捉異常 privatestaticvoidthrowstest throwsarithmeticexception system out println 這只是一個(gè)測試 程序處理過程假設(shè)發(fā)生異常thrownewarithmeticexception 簡單的說 您要不就在方法中直接處理異常 要不就在方法上聲明該方法會(huì)拋出異常 由調(diào)用它的調(diào)用者來處理異常 另一方面 在方法上使用 throws 聲明可拋出的異常 也表示了您只能拋出所聲明類型的異常 其它的異常您必須在方法中處理完 或是重新包裝為所聲明的異常再拋出 如果使用繼承時(shí) 在父類別的某個(gè)方法上宣告了throws某些異常 而在子類別中重新定義該方法時(shí) 您可以 不處理異常 重新定義時(shí)不設(shè)定throws 可僅throws父類別中被重新定義的方法上之某些異??蓆hrows被重新定義的方法上之異常之子類別但是您不可以 throws出額外的異常throws被重新定義的方法上之異常之父類別 java的異常處理機(jī)制并不是只有將程序邏輯與異常處理分開的好處 程序設(shè)計(jì)的錯(cuò)誤情況很多且難以估計(jì) 并沒有人能保證自已所設(shè)計(jì)的程序完全無誤 異常處理最重要的是為程序設(shè)計(jì)人員提供種種可能的異常情況 讓程序設(shè)計(jì)人員能夠掌握并設(shè)法排除 java編譯器會(huì)檢查程序語法等的相關(guān)錯(cuò)誤 這些錯(cuò)誤是屬于 編譯時(shí)期錯(cuò)誤 然而語法無誤并不代表程序邏輯沒有錯(cuò)誤 邏輯上的錯(cuò)誤會(huì)在程序執(zhí)行時(shí)發(fā)生 這是屬于 執(zhí)行時(shí)期錯(cuò)誤 而即使邏輯沒有錯(cuò)誤 也可能因?yàn)閕 o 網(wǎng)絡(luò)或甚至內(nèi)存不足等情況而發(fā)生錯(cuò)誤 java所處理的異常主要可分為兩大類 一種是嚴(yán)重的錯(cuò)誤 例如硬件錯(cuò)誤或內(nèi)存不足等問題 與此相關(guān)的類別是位于java lang下的error類別 另一種是非嚴(yán)重的錯(cuò)誤 代表可以處理的狀況 與此相關(guān)的是位于java lang下的exception類別 error類別與exception類別都繼承自throwable類別 throwable類別擁有幾個(gè)報(bào)告相關(guān)異常訊息的方法 除了使用這些方法之外 我們也可以利用tostring 取得異常對(duì)象的錯(cuò)誤描述 您所處理的異常通常都是衍生自exception類別 其中大部份是執(zhí)行時(shí)期異常 runtimeexception 例如arithmeticexception arrayindexoutofboundsexception等等 另外還有一些非執(zhí)行時(shí)期異常 例如classnotfoundexception 嘗試加載類別時(shí)失敗所引發(fā) 例如類別不存在 interruptedexception 執(zhí)行緒非執(zhí)行中而嘗試中斷所引發(fā)的異常 等等 以下列出一些重要的繼承架構(gòu) throwableerror 嚴(yán)重的系統(tǒng)錯(cuò)誤 linkageerrorthreaddeathvirtualmachineerror exceptionclassnotfoundexceptionclonenotsupportedexceptionillegalaccessexception runtimeexception 執(zhí)行時(shí)期異常 arithmeticexceptionarraystoreexceptionclasscastexception 屬于runtimeexception衍生出來的類別 是在執(zhí)行時(shí)期會(huì)發(fā)生的 不需要特別使用try catch或是在函數(shù)上使用 throws 宣告也可以通過編譯 例如您在使用數(shù)組時(shí) 并不一定要處理arrayindexoutofboundsexception異常 exception下非runtimeexception衍生之異常如果有引發(fā)的可能性 則您一定要在程序中明確的指定處理才可以通過編譯 例如當(dāng)您使用到bufferedreader類別時(shí) 由于有可能引發(fā)ioexception 您要不就在try catch中處理 要不就在函數(shù)上使用throws表示由呼叫它的函數(shù)來處理 了解異常處理的繼承架構(gòu)是必須的 例如在捕捉異常對(duì)象時(shí) 如果父類別異常對(duì)象撰寫在子類別異常對(duì)象之前被捕捉 則catch子類別異常對(duì)象的區(qū)塊將永遠(yuǎn)不會(huì)被執(zhí)行 事實(shí)上編譯器也會(huì)幫您檢查這個(gè)錯(cuò)誤請(qǐng)大家來預(yù)測下面的程序的結(jié)果 importjava io publicclassuseexception publicstaticvoidmain string args try thrownewarithmeticexception 異常測試 catch exceptione system out println e tostring catch arithmeticexceptione system out println e tostring 這個(gè)程序若在編譯時(shí)將會(huì)產(chǎn)生以下的錯(cuò)誤信息 useexception java 11 exceptionjava lang arithmeticexceptionhasalreadybeencaughtcatch arithmeticexceptione 1error 要完成這個(gè)程序的編譯 您必須更改異常對(duì)象捕捉的順序 例如 importjava io publicclassuseexception publicstaticvoidmain string args try thrownewarithmeticexception 異常測試 catch arithmeticexceptione

溫馨提示

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

評(píng)論

0/150

提交評(píng)論