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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論