版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、例外處理,什么是例外(Exception),例外就是在程序的運行過程中所發(fā)生的異常事件,它中斷指令的正常執(zhí)行。,Java異常,Java程序運行過程中所發(fā)生的異常事件可分為兩類: 錯誤(Error):JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴重情況 違例(Exception): 其它因編程錯誤或偶然的外在因素導(dǎo)致的一般性問題,例如: 對負數(shù)開平方根 空指針訪問 試圖讀取不存在的文件 網(wǎng)絡(luò)連接中斷,例外示例,編譯下面的程序: import java.io.*; class ExceptionDemo1 public static void main( String args ) FileInputStrea
2、m fis = new FileInputStream( text ); int b; while( (b=fis.read()!=-1 ) System.out.print( b ); fis.close( ); ,例外示例,C:javac ExceptionDemol.java ExceptionDemo1.java:6: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileInputStream fis
3、 = new FileInputStream( text ); ExceptionDemo1.java:8: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while( (b=fis.read()!=-1 ) 2 errors,例外示例,編譯和運行下面的程序: class ExceptionDemo2 public static void main( String args ) int a = 0; System.out.prin
4、tln( 5/a ); ,例外示例,C:javac ExceptionDemo2.java C:java ExceptionDemo2 java.lang.ArithmeticException: / by zero at ExceptionDemo2.main(ExceptionDemo2.java:4) 有些例外(異常)在編譯的時候能夠發(fā)現(xiàn),有些是在運行的時候發(fā)現(xiàn),例外處理機制,在Java程序的執(zhí)行過程中,如果出現(xiàn)了異常事件,就會生成一個例外對象。 Java例外處理機制:拋出(Throw)例外和捕獲(catch)例外 例外對象可能是由正在運行的方法生成,也可能由Java虛擬機生成,其中包含
5、一些信息指明異常事件的類型,以及當異常發(fā)生時程序的運行狀態(tài)等。生成的例外對象傳遞給Java運行時系統(tǒng)(Java Runtime System),這一例外對象的產(chǎn)生和提交過程稱為拋棄(throw)例外,例外處理機制,Java運行時系統(tǒng)得到一個異常對象時,它將會尋找處理這一異常的代碼。尋找的對象從生成異常對象的代碼塊開始,沿著方法的調(diào)用棧逐層回溯,直到找到一個方法能夠處理這種類型的異常為止。然后運行時系統(tǒng)把當前異常對象交給這個方法進行處理。這一過程稱為捕獲(catch)異常。 。 如果Java運行時系統(tǒng)找不到可以捕獲例外的方法,則運行時系統(tǒng)將終止,相應(yīng)的Java程序也將退出。 一個異常事件對應(yīng)一個
6、例外對象。,例外類的層次,Error 動態(tài)鏈接失敗,虛擬機錯誤等,通常Java程序不應(yīng)該捕獲這類例外,也不會拋棄這種例外。 Exception 運行時例外(可以不處理) 繼承于RuntimeException。Java編譯器允許程序不對它們做出處理,必要時也可以處理。 非運行時例外(必須處理) 除了運行時例外之外的其他由Exception繼承來的例外類。Java編譯器要求程序必須捕獲或者聲明拋棄這種例外。,捕獲例外 捕獲例外是通過try-catch-finally語句實現(xiàn)的。 try ./可能發(fā)生例外的代碼 catch( ExceptionName1 e ) ./例外處理代碼 catch( E
7、xceptionName2 e ) ./例外處理代碼 . finally .例外處理語句的統(tǒng)一出口 ,try 捕獲例外的第一步是用try選定捕獲例外的范圍,由try所限定的代碼塊中的語句在執(zhí)行過程中可能會生成例外對象并拋棄。,catch 每個try代碼塊可以伴隨一個或多個catch語句,用于處理try代碼塊中所生成的例外事件。catch語句只需要一個形式參數(shù)指明它所能夠捕獲的例外類型,這個類必須是Throwable的子類,運行時系統(tǒng)通過參數(shù)值把被拋棄的例外對象傳遞給catch塊. 在catch塊中是對例外對象進行處理的代碼,與訪問其它對象一樣,可以訪問一個例外對象的變量或調(diào)用它的方法。getM
8、essage( )是類Throwable所提供的方法,用來得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace( )用來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內(nèi)容。,import java.io.*; public class ExceptionDemo1 public static void main(String args) try FileInputStream fis = new FileInputStream(text); /可能發(fā)生異常 int b; while ( (b = fis.read() != -1) System.out.println(b);
9、fis.close(); ,catch(FileNotFoundException ex) System.out.println(文件不存在異常.); System.out.println(ex.getMessage(); System.out.println(ex); ex.printStackTrace(System.out); catch (IOException ex) System.out.println(輸入/輸出異常.); System.out.println(ex); ,catch語句的順序,捕獲例外的順序和不同catch語句的順序有關(guān),當捕獲到一個例外時,剩下的catch語句
10、就不再進行匹配。 “匹配”是指catch語句的參數(shù)類型和異常對象的類型完全相同或者為異常對象的父類型。 在安排catch語句的順序時,首先應(yīng)該捕獲最特殊的例外,然后再逐漸一般化。也就是一般先安排子類,再安排父類。,catch (IOException ex) System.out.println(輸入/輸出異常.); System.out.println(ex); catch(FileNotFoundException ex) System.out.println(文件不存在異常.); System.out.println(ex.getMessage(); System.out.println
11、(ex); ex.printStackTrace(System.out); 兩個catch語句的順序調(diào)整后,報告如下的錯誤: ExceptionDemo1.java: exception java.io.FileNotFoundException has already been caught at line 24, column 18,finally 捕獲例外的最后一步是通過finally語句為例外處理提供一個統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語句都會被執(zhí)行。 可選的。, try File
12、InputStream fis = new FileInputStream(text); int b=0; System.out.println(5/b); catch(ArithmeticException e) finally if (fis!=null) System.out.println(“closing FileInputStream”); else System.out.println(“FileInputStream not open”); 通過finally可以正常的關(guān)閉文件。,通過一個完整的例子說明不同情況下的異常捕獲,import java.io.*; public cl
13、ass ExceptionDemo1 public static void main(String args) FileInputStream fis = null; try System.out.println(第一個命令行參數(shù)是:+args0); fis = new FileInputStream(text); System.out.println(文件的內(nèi)容是:); int b ; while ( (b = fis.read() != -1) System.out.print(char)b); System.out.println(n); fis.close(); ,catch (Fil
14、eNotFoundException ex) System.out.println(發(fā)生文件不存在的異常.); System.out.println(ex); catch (IOException ex) System.out.println(輸入/輸出異常.); System.out.println(ex); catch(IndexOutOfBoundsException e) System.out.println(“數(shù)組越界異?!?; System.out.println(e); ,finally if (fis != null) System.out.println(正在關(guān)閉文件。);
15、try fis.close(); catch (IOException ex1) else System.out.println(文件輸入流沒有打開。); ,第一種情況:要打開的文件不存在時,程序運行時會生成FileNotFoundException異常對象,運行時系統(tǒng)把它交給第一個catch語句處理,最后執(zhí)行finally語句,運行結(jié)果如下: 第一個命令行參數(shù)是:hello 發(fā)生文件不存在的異常。 java.io.FileNotFoundException: text (系統(tǒng)找不到指定的文件。) 文件輸入流沒有打開。,第二種情況,我們創(chuàng)建了文件“text”,但是在運行時,我們不給出任何參數(shù),
16、這時會放生IndexOutOfBoundsException類的異常,運行時系統(tǒng)把它交給第三個catch語句處理,最后執(zhí)行finally語句,執(zhí)行結(jié)果如下: java.lang.ArrayIndexOutOfBoundsException: 0 at ExceptionDemo1.main(ExceptionDemo1.java:6) Exception in thread main 文件輸入流沒有打開。,第三種情況,程序正確執(zhí)行try代碼塊后,執(zhí)行finally語句,運行結(jié)果如下: 第一個命令行參數(shù)是:Hello 文件的內(nèi)容是: let us begin to use java,let us
17、 begin to know java. 正在關(guān)閉文件。,聲明拋棄例外,如果在一個方法中生成了一個例外,但是這一方法并不確切地知道該如何對這一異常事件進行處理,這時,一個方法就應(yīng)該聲明拋棄例外,使得例外對象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。,聲明拋棄例外(參考J2SDK文檔),聲明拋棄例外是在一個方法聲明中的throws子句中指明的。例如: public int read () throws IOException . throws子句中同時可以指明多個例外,說明該方法將不對這些例外進行處理,而是聲明拋棄它們: public static void main(String ar
18、gs) throws IOException,IndexOutOfBoundsException ,人工拋出異常,Java異常類對象除在程序執(zhí)行過程中出現(xiàn)異常時由系統(tǒng)自動生成并拋出,也可根據(jù)需要人工創(chuàng)建并拋出 首先要生成異常對象,然后通過throw語句實現(xiàn)拋出操作(提交給Java運行環(huán)境)。 IOException e =new IOException(); throw e; 可以拋出的異常必須是Throwable或其子類的實例。下面的語句在編譯時將會產(chǎn)生語法錯誤: throw new String(want to throw);,例外類的使用,自定義例外類必須是Throwable的直接或間接
19、子類,一般定義為Exception的子類 一個方法所聲明拋棄的例外是作為這個方法與外界交互的一部分而存在的。方法的調(diào)用者必須了解這些例外,并確定如何正確的處理他們。,例外類的使用,FileInputStream 的API public FileInputStream(String name) throws FileNotFoundException,例外示例,import java.io.*; class ExceptionDemo1 public static void main( String args ) FileInputStream fis = new FileInputStream
20、( text ); ,例外類的使用,積極處理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) try FileInputStream fis = new FileInputStream( text ); catch(FileNotFoundException e) ,例外類的使用,消極處理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) throws FileNotFo
21、undException FileInputStream fis = new FileInputStream( text ); ,例外類的使用,如果采用消極處理方式,則由調(diào)用該方法的方法進行處理;但是調(diào)用該方法的方法也可以采用消極和積極兩種處理方式,一直傳遞到Java運行環(huán)境.,例外類的使用,運行時例外則表示由運行時系統(tǒng)所檢測到的程序設(shè)計問題或者API的使用不當問題,它可能在程序的任何地方出現(xiàn): (1)對于運行時例外,如果不能預(yù)測它何時發(fā)生,程序可以不做處理,而是讓Java虛擬機去處理它。 (2)如果程序可以預(yù)知運行時例外可能發(fā)生的地點和時間,則應(yīng)該在程序中進行處理,而不應(yīng)簡單的把它交給運行時系統(tǒng)。,例外類的使用,(3)在自定義例外類時,如果它所對應(yīng)的異常事件通??偸窃谶\行時產(chǎn)生的,而且不容易預(yù)測它將在何時、何處發(fā)生,則可以把它定義為運行時例外,否則應(yīng)定義為非運行時例外。,重寫方法聲明拋棄異常原則,重寫方法不能拋出比被重寫方法范圍更大的異常類型,public class A public void methodA() throws IOException public class B1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)安全保衛(wèi)與應(yīng)急管理指南(標準版)
- 2025年智能家居產(chǎn)品售后服務(wù)規(guī)范
- 法律合規(guī)與風險控制制度
- 2025年醫(yī)療器械使用與維護規(guī)范
- 超市員工績效考核及評價制度
- 超市庫存管理及盤點制度
- 2026年西岸華府幼兒園短期教師招聘備考題庫及完整答案詳解1套
- 養(yǎng)老院老人健康飲食營養(yǎng)師激勵制度
- 2026年青島中遠海運物流供應(yīng)鏈有限公司招聘備考題庫完整答案詳解
- 2026年舟山市普朱管委會黨政辦公室招聘備考題庫及完整答案詳解1套
- 器官移植術(shù)后排斥反應(yīng)的風險分層管理
- 虛擬電廠關(guān)鍵技術(shù)
- 事業(yè)單位清算及財務(wù)報告編寫范本
- 護坡綠化勞務(wù)合同范本
- 臨床績效的DRG與CMI雙指標調(diào)控
- 2026年湛江日報社公開招聘事業(yè)編制工作人員備考題庫及完整答案詳解
- 2025-2026學年人教版數(shù)學三年級上學期期末仿真模擬試卷一(含答案)
- 2025年涼山教師業(yè)務(wù)素質(zhì)測試題及答案
- 2026年昭通市威信縣公安局第一季度輔警招聘(14人)筆試模擬試題及答案解析
- 氫能技術(shù)研發(fā)協(xié)議
- 2025交管12123學法減分整套試題帶答案解析(全國適用)
評論
0/150
提交評論