第07章異常處理_第1頁(yè)
第07章異常處理_第2頁(yè)
第07章異常處理_第3頁(yè)
第07章異常處理_第4頁(yè)
第07章異常處理_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java面向?qū)ο竺嫦驅(qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程河南大學(xué)計(jì)算機(jī)與信息工程學(xué)院河南大學(xué)計(jì)算機(jī)與信息工程學(xué)院目錄目錄第第1章章 Java語(yǔ)言概述語(yǔ)言概述第第2章章 Java基本語(yǔ)法規(guī)則基本語(yǔ)法規(guī)則第第3章章 Java中的面向?qū)ο蠹夹g(shù)中的面向?qū)ο蠹夹g(shù)第第4章章 Java基本結(jié)構(gòu)程序基本結(jié)構(gòu)程序第第5章章 Java基本類(lèi)基本類(lèi)第第6章章 圖形用戶界面圖形用戶界面第第7章章 異常處理異常處理第第8章章 多線程多線程第第9章章 Java Applet程序程序第第10章章 輸入輸出流與文件處理輸入輸出流與文件處理第第11章章 Java網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程第第12章章 數(shù)據(jù)庫(kù)應(yīng)用數(shù)據(jù)庫(kù)應(yīng)用3第第7章章 異

2、常處理異常處理7.1 異常處理概述異常處理概述7.2 Java的異常處理的異常處理4n異常:異常:程序運(yùn)行過(guò)程中發(fā)生的異常事件程序運(yùn)行過(guò)程中發(fā)生的異常事件,這些,這些事件的發(fā)生將事件的發(fā)生將阻止程序的正常運(yùn)行。阻止程序的正常運(yùn)行。 例如:例如:除除0 0、數(shù)組越界、文件找不到等。、數(shù)組越界、文件找不到等。第第7章章 異常處理異常處理n異常處理機(jī)制:異常處理機(jī)制:在一個(gè)方法運(yùn)行時(shí),在一個(gè)方法運(yùn)行時(shí),如果發(fā)生了異常,則這如果發(fā)生了異常,則這個(gè)方法生成一個(gè)對(duì)象代表該異常,并把它交給運(yùn)行時(shí)系統(tǒng),個(gè)方法生成一個(gè)對(duì)象代表該異常,并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)尋找相應(yīng)的代碼來(lái)處理這一異常。運(yùn)行時(shí)系統(tǒng)尋找相

3、應(yīng)的代碼來(lái)處理這一異常。n拋出異常:拋出異常:生成異常對(duì)象并把它提交給運(yùn)行時(shí)系統(tǒng)的過(guò)程生成異常對(duì)象并把它提交給運(yùn)行時(shí)系統(tǒng)的過(guò)程稱稱為拋出異常。為拋出異常。n捕獲異常:捕獲異常:運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成異常運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成異常的方法開(kāi)始回溯,直到找到包含相應(yīng)異常處理的方法為止的方法開(kāi)始回溯,直到找到包含相應(yīng)異常處理的方法為止,這一過(guò)程稱為捕獲異常。這一過(guò)程稱為捕獲異常。57.1.1 程序中常見(jiàn)的錯(cuò)誤程序中常見(jiàn)的錯(cuò)誤7.1.2 Java中的異常類(lèi)中的異常類(lèi)7.1.3 異常處理過(guò)程異常處理過(guò)程7.1 異常處理概述異常處理概述6n1.面向過(guò)程語(yǔ)言錯(cuò)誤處理方式的缺陷面

4、向過(guò)程語(yǔ)言錯(cuò)誤處理方式的缺陷nC語(yǔ)言中,通過(guò)調(diào)用語(yǔ)言中,通過(guò)調(diào)用if語(yǔ)句來(lái)判斷是否出現(xiàn)了異常,這樣語(yǔ)句來(lái)判斷是否出現(xiàn)了異常,這樣使得異常的發(fā)現(xiàn)和處理與正常代碼相混淆。使得異常的發(fā)現(xiàn)和處理與正常代碼相混淆。n面向過(guò)程語(yǔ)言面向過(guò)程語(yǔ)言提供的錯(cuò)誤處理方式是不完全的提供的錯(cuò)誤處理方式是不完全的,不能保證,不能保證及時(shí)發(fā)現(xiàn)錯(cuò)誤并制止錯(cuò)誤的蔓延。及時(shí)發(fā)現(xiàn)錯(cuò)誤并制止錯(cuò)誤的蔓延。n面向過(guò)程語(yǔ)言面向過(guò)程語(yǔ)言沒(méi)有提供對(duì)運(yùn)行時(shí)錯(cuò)誤的防范和處理機(jī)制沒(méi)有提供對(duì)運(yùn)行時(shí)錯(cuò)誤的防范和處理機(jī)制,只能任憑錯(cuò)誤的產(chǎn)生而只能任憑錯(cuò)誤的產(chǎn)生而導(dǎo)致程序運(yùn)行中斷導(dǎo)致程序運(yùn)行中斷。7.1 異常處理概述異常處理概述7n2.面向?qū)ο笳Z(yǔ)言的異常處

5、理思想面向?qū)ο笳Z(yǔ)言的異常處理思想n在面向?qū)ο笤O(shè)計(jì)中,程序的在面向?qū)ο笤O(shè)計(jì)中,程序的正確性、可靠性正確性、可靠性和和穩(wěn)定性穩(wěn)定性比比程序效率更重要程序效率更重要。n面向?qū)ο笳Z(yǔ)言面向?qū)ο笳Z(yǔ)言提供語(yǔ)言級(jí)的錯(cuò)誤防范和處理機(jī)制提供語(yǔ)言級(jí)的錯(cuò)誤防范和處理機(jī)制,這就,這就是是異常處理機(jī)制異常處理機(jī)制,它提供全面的、嚴(yán)格的錯(cuò)誤檢查與處,它提供全面的、嚴(yán)格的錯(cuò)誤檢查與處理方法。理方法。n使用異常機(jī)制,使用異常機(jī)制,將程序?qū)⒊绦蛘4a正常代碼與與錯(cuò)誤處理代碼錯(cuò)誤處理代碼分開(kāi)分開(kāi),使程序結(jié)構(gòu)清晰,讀寫(xiě)和調(diào)試代碼變得清晰;使用異常使程序結(jié)構(gòu)清晰,讀寫(xiě)和調(diào)試代碼變得清晰;使用異常處理語(yǔ)句處理語(yǔ)句使程序具有處理錯(cuò)誤的能

6、力使程序具有處理錯(cuò)誤的能力。7.1 異常處理概述異常處理概述87.1.1 程序中常見(jiàn)的錯(cuò)誤程序中常見(jiàn)的錯(cuò)誤1.語(yǔ)法錯(cuò)語(yǔ)法錯(cuò)n如果程序如果程序編譯不通過(guò)編譯不通過(guò),說(shuō)明程序中存在,說(shuō)明程序中存在語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤。n語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤: :由于違反語(yǔ)法規(guī)則產(chǎn)生的由于違反語(yǔ)法規(guī)則產(chǎn)生的。 例:例:標(biāo)識(shí)符未聲明、括號(hào)不匹配、語(yǔ)句末尾缺少分號(hào)等。標(biāo)識(shí)符未聲明、括號(hào)不匹配、語(yǔ)句末尾缺少分號(hào)等。n處理方法:處理方法:Java編譯器編譯器能發(fā)現(xiàn)語(yǔ)法錯(cuò)誤能發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,并給出錯(cuò)誤的,并給出錯(cuò)誤的位置和性質(zhì)。程序員必須改正這些語(yǔ)法錯(cuò)誤,才能重新位置和性質(zhì)。程序員必須改正這些語(yǔ)法錯(cuò)誤,才能重新編譯程序。編譯程序。n例

7、:例:string string=Tom;92.語(yǔ)義錯(cuò)語(yǔ)義錯(cuò)n異常異常:如果如果編譯通過(guò)編譯通過(guò),但程序在,但程序在運(yùn)行時(shí)因?yàn)槌霈F(xiàn)錯(cuò)誤而被運(yùn)行時(shí)因?yàn)槌霈F(xiàn)錯(cuò)誤而被迫終止運(yùn)行迫終止運(yùn)行,則稱這種錯(cuò)誤為,則稱這種錯(cuò)誤為異常異常。nJava解釋器解釋器在運(yùn)行時(shí)能夠發(fā)現(xiàn)異常,在運(yùn)行時(shí)能夠發(fā)現(xiàn)異常,一旦發(fā)現(xiàn)了異常,一旦發(fā)現(xiàn)了異常,Java將停止程序運(yùn)行,將停止程序運(yùn)行,并給出異常的位置和性質(zhì)并給出異常的位置和性質(zhì)。n處理方法:處理方法:若編程時(shí)考慮周全,若編程時(shí)考慮周全,有些異常是可以避免的有些異常是可以避免的。還有一些異常是還有一些異常是不可預(yù)知的,不能不可預(yù)知的,不能在程序中在程序中事先處理事先處理,

8、如打開(kāi)文件不存在等,這些錯(cuò)誤的發(fā)生不能由程序本身如打開(kāi)文件不存在等,這些錯(cuò)誤的發(fā)生不能由程序本身所控制,因此必須進(jìn)行異常處理。所控制,因此必須進(jìn)行異常處理。7.1.1 程序中常見(jiàn)的錯(cuò)誤程序中常見(jiàn)的錯(cuò)誤103.邏輯錯(cuò)邏輯錯(cuò)n邏輯錯(cuò)誤邏輯錯(cuò)誤: 如果程序如果程序編譯通過(guò)編譯通過(guò),也能,也能正常運(yùn)行正常運(yùn)行,但,但運(yùn)行運(yùn)行結(jié)果與期望不相符結(jié)果與期望不相符,這說(shuō)明程序中存在,這說(shuō)明程序中存在邏輯錯(cuò)誤邏輯錯(cuò)誤。n例如:例如:由于分支語(yǔ)句中的判斷條件設(shè)置錯(cuò)誤,導(dǎo)致某個(gè)由于分支語(yǔ)句中的判斷條件設(shè)置錯(cuò)誤,導(dǎo)致某個(gè)數(shù)據(jù)參與到不正確的分支中進(jìn)行計(jì)算。數(shù)據(jù)參與到不正確的分支中進(jìn)行計(jì)算。n邏輯錯(cuò)邏輯錯(cuò)往往是由于程序的

9、往往是由于程序的設(shè)計(jì)思路不正確設(shè)計(jì)思路不正確而造成的。而造成的。n處理方法:處理方法:系統(tǒng)是系統(tǒng)是不能自動(dòng)檢查出邏輯錯(cuò)誤的,不能自動(dòng)檢查出邏輯錯(cuò)誤的,只能靠只能靠編程人員憑經(jīng)驗(yàn)分析并改錯(cuò)。編程人員憑經(jīng)驗(yàn)分析并改錯(cuò)。7.1.1 程序中常見(jiàn)的錯(cuò)誤程序中常見(jiàn)的錯(cuò)誤11nJava語(yǔ)言中用語(yǔ)言中用異常類(lèi)對(duì)象異常類(lèi)對(duì)象來(lái)描述異常。在程序的執(zhí)行過(guò)程來(lái)描述異常。在程序的執(zhí)行過(guò)程中,如果發(fā)生了異常,就會(huì)生成一個(gè)異常類(lèi)對(duì)象。中,如果發(fā)生了異常,就會(huì)生成一個(gè)異常類(lèi)對(duì)象。n異常類(lèi)對(duì)象:異常類(lèi)對(duì)象:包含異常的包含異常的類(lèi)型類(lèi)型,以及,以及當(dāng)異常發(fā)生時(shí)程序的當(dāng)異常發(fā)生時(shí)程序的運(yùn)行狀態(tài)。運(yùn)行狀態(tài)。n異常類(lèi)的祖先類(lèi):異常類(lèi)的

10、祖先類(lèi):java.lang.Throwable。nThrowable類(lèi):類(lèi):定義了方法來(lái)檢索與異常相關(guān)的信息,并定義了方法來(lái)檢索與異常相關(guān)的信息,并打印顯示異常發(fā)生的棧跟蹤信息。打印顯示異常發(fā)生的棧跟蹤信息。ngetMessage():返回返回String類(lèi)型的異常信息。類(lèi)型的異常信息。nprintStackTrace():打印棧跟蹤信息。打印棧跟蹤信息。7.1.2 Java中的異常類(lèi)中的異常類(lèi)1.Java用異常類(lèi)來(lái)處理異常用異常類(lèi)來(lái)處理異常12n根據(jù)異常的性質(zhì)不同,根據(jù)異常的性質(zhì)不同,Throwable類(lèi)又派生出兩個(gè)類(lèi)類(lèi)又派生出兩個(gè)類(lèi)Error類(lèi)和類(lèi)和Exception類(lèi)。類(lèi)。nError

11、(錯(cuò)誤錯(cuò)誤)類(lèi):類(lèi):表示僅靠程序本身無(wú)法修復(fù)的嚴(yán)重錯(cuò)誤。表示僅靠程序本身無(wú)法修復(fù)的嚴(yán)重錯(cuò)誤。Error類(lèi)對(duì)象類(lèi)對(duì)象由由Java虛擬機(jī)生成并拋出給系統(tǒng)虛擬機(jī)生成并拋出給系統(tǒng),有內(nèi)存溢出,有內(nèi)存溢出錯(cuò)誤、系統(tǒng)崩潰、動(dòng)態(tài)鏈接失敗等。錯(cuò)誤、系統(tǒng)崩潰、動(dòng)態(tài)鏈接失敗等。Java程序中的錯(cuò)誤在運(yùn)行時(shí)生成程序中的錯(cuò)誤在運(yùn)行時(shí)生成Error類(lèi)的對(duì)象。類(lèi)的對(duì)象。7.1.2 Java中的異常類(lèi)中的異常類(lèi)1.Java用異常類(lèi)來(lái)處理異常用異常類(lèi)來(lái)處理異常13nException(異常異常)類(lèi)類(lèi):表示程序本身可以處理的異常:表示程序本身可以處理的異常Exception類(lèi)對(duì)象類(lèi)對(duì)象由由Java程序中程序中正運(yùn)行的方法正運(yùn)行

12、的方法生成生成。自身類(lèi)中自身類(lèi)中只聲明了一些構(gòu)造方法只聲明了一些構(gòu)造方法。Exception類(lèi)類(lèi)派生派生許多子類(lèi)許多子類(lèi),也可以,也可以自定義自定義異常類(lèi)異常類(lèi)。每個(gè)異常對(duì)應(yīng)于每個(gè)異常對(duì)應(yīng)于Exception類(lèi)的一個(gè)子類(lèi)的實(shí)例,異常對(duì)象類(lèi)的一個(gè)子類(lèi)的實(shí)例,異常對(duì)象中中包含異常的位置和特征信息包含異常的位置和特征信息。RuntimeException: 運(yùn)行時(shí)異常運(yùn)行時(shí)異常,指由程序本身錯(cuò)誤引發(fā),指由程序本身錯(cuò)誤引發(fā)的異常,這類(lèi)異常在程序設(shè)計(jì)時(shí)大多可以避免。的異常,這類(lèi)異常在程序設(shè)計(jì)時(shí)大多可以避免。7.1.2 Java中的異常類(lèi)中的異常類(lèi)1.Java用異常類(lèi)來(lái)處理異常用異常類(lèi)來(lái)處理異常14nRu

13、ntimeException類(lèi)的一些常用子類(lèi)類(lèi)的一些常用子類(lèi)(1) 算術(shù)異常類(lèi)算術(shù)異常類(lèi)ArithmeticException:當(dāng)進(jìn)行整數(shù)除法或取余當(dāng)進(jìn)行整數(shù)除法或取余運(yùn)算時(shí),如果除數(shù)為運(yùn)算時(shí),如果除數(shù)為0 0,則產(chǎn)生該異常。,則產(chǎn)生該異常。7.1.2 Java中的異常類(lèi)中的異常類(lèi)(2) 空對(duì)象異??諏?duì)象異常NullPointerException:當(dāng)一個(gè)對(duì)象賦值為當(dāng)一個(gè)對(duì)象賦值為null時(shí),若通過(guò)該空對(duì)象調(diào)用方法,則產(chǎn)生該異常。時(shí),若通過(guò)該空對(duì)象調(diào)用方法,則產(chǎn)生該異常。例例: String str=null; System.out.println(str.length(); (3)類(lèi)型強(qiáng)制轉(zhuǎn)

14、換異常類(lèi)型強(qiáng)制轉(zhuǎn)換異常ClassCastException:當(dāng)進(jìn)行類(lèi)型強(qiáng)制當(dāng)進(jìn)行類(lèi)型強(qiáng)制 轉(zhuǎn)換時(shí),如果遇到不能進(jìn)行的轉(zhuǎn)換操作,則產(chǎn)生該異常。轉(zhuǎn)換時(shí),如果遇到不能進(jìn)行的轉(zhuǎn)換操作,則產(chǎn)生該異常。例:例:Object obj=new object(); String str=(String) obj; Person p=new Student(); Student s=(Student) p;15(4)數(shù)組下標(biāo)越界異常數(shù)組下標(biāo)越界異常ArrayIndexOutOfBoundsException: 當(dāng)訪問(wèn)數(shù)組元素時(shí),如果下標(biāo)越界,則產(chǎn)生該異常。當(dāng)訪問(wèn)數(shù)組元素時(shí),如果下標(biāo)越界,則產(chǎn)生該異常。例如:例如:

15、 int arr=new int1; arr1=1;7.1.2 Java中的異常類(lèi)中的異常類(lèi)(5)數(shù)值格式異常數(shù)值格式異常NumberFormatException:當(dāng)將字符串轉(zhuǎn)換當(dāng)將字符串轉(zhuǎn)換 成整數(shù)時(shí),如果給定字符串不符合整數(shù)格式,則產(chǎn)生該異常。成整數(shù)時(shí),如果給定字符串不符合整數(shù)格式,則產(chǎn)生該異常。例如:例如:int j=Integer.parseInt(“abc”);【例例】RuntimeException類(lèi)常用子類(lèi)類(lèi)常用子類(lèi)舉例。舉例。16圖圖1 Java中異常類(lèi)的層次關(guān)系圖中異常類(lèi)的層次關(guān)系圖2.錯(cuò)誤類(lèi)和異常類(lèi)的層次關(guān)系錯(cuò)誤類(lèi)和異常類(lèi)的層次關(guān)系17一個(gè)一個(gè)異常對(duì)象經(jīng)歷拋出、捕獲及處理

16、過(guò)程:異常對(duì)象經(jīng)歷拋出、捕獲及處理過(guò)程:拋出拋出(throw)異常異常創(chuàng)建一個(gè)異常類(lèi)對(duì)象的過(guò)程創(chuàng)建一個(gè)異常類(lèi)對(duì)象的過(guò)程;捕獲捕獲(catch)異常異常獲得異常對(duì)象的過(guò)程獲得異常對(duì)象的過(guò)程;處理異常處理異常對(duì)異常對(duì)象執(zhí)行相應(yīng)操作的過(guò)程對(duì)異常對(duì)象執(zhí)行相應(yīng)操作的過(guò)程;注:注:異常對(duì)象由捕獲它的語(yǔ)句進(jìn)行處理。異常對(duì)象由捕獲它的語(yǔ)句進(jìn)行處理。7.1.3 異常處理過(guò)程異常處理過(guò)程187.1.3 異常處理過(guò)程異常處理過(guò)程1) 拋出異常:拋出異常:程序運(yùn)行時(shí)出現(xiàn)異常則生成異常對(duì)象,生成的程序運(yùn)行時(shí)出現(xiàn)異常則生成異常對(duì)象,生成的異常對(duì)象被提交給異常對(duì)象被提交給JVM。2) 捕獲異常捕獲異常: :JVM得到一個(gè)異

17、常對(duì)象后,它將會(huì)尋找處理這得到一個(gè)異常對(duì)象后,它將會(huì)尋找處理這一異常的代碼,尋找的過(guò)程一異常的代碼,尋找的過(guò)程從生成異常的方法開(kāi)始從生成異常的方法開(kāi)始,沿著沿著方法的調(diào)用棧方法的調(diào)用棧逐層回溯逐層回溯,直到找到包含相應(yīng)異常處理的方,直到找到包含相應(yīng)異常處理的方法為止。然后法為止。然后JVM將當(dāng)前異常類(lèi)對(duì)象交給該方法進(jìn)行處理。將當(dāng)前異常類(lèi)對(duì)象交給該方法進(jìn)行處理。3) 如果查遍整個(gè)調(diào)用棧仍如果查遍整個(gè)調(diào)用棧仍找不到找不到合適的異常處理方法合適的異常處理方法,則,則JVM將終止將終止Java程序的執(zhí)行。程序的執(zhí)行。197.2.1 trycatchfinally異常處理語(yǔ)句異常處理語(yǔ)句7.2.2 用用

18、throw拋出自定義異常對(duì)象拋出自定義異常對(duì)象7.2.3 用用throws將異常拋給上級(jí)調(diào)用方法處理將異常拋給上級(jí)調(diào)用方法處理7.2.4 自定義異常類(lèi)自定義異常類(lèi)7.2 Java的異常處理的異常處理207.2.1 try-catch-finally語(yǔ)句語(yǔ)句try 語(yǔ)句序列語(yǔ)句序列1 /存在潛在異常的代碼塊存在潛在異常的代碼塊 catch (異常類(lèi)異常類(lèi) 異常對(duì)象名異常對(duì)象名) / 用于捕獲并處理指定類(lèi)型的異常對(duì)象,參數(shù)是一個(gè)異常對(duì)象用于捕獲并處理指定類(lèi)型的異常對(duì)象,參數(shù)是一個(gè)異常對(duì)象e, 其類(lèi)型必須是其類(lèi)型必須是Exception類(lèi)及其子類(lèi)。類(lèi)及其子類(lèi)。語(yǔ)句序列語(yǔ)句序列2 /對(duì)某種異常類(lèi)對(duì)象進(jìn)

19、行處理的代碼塊對(duì)某種異常類(lèi)對(duì)象進(jìn)行處理的代碼塊 finally /子句可以省略子句可以省略語(yǔ)句序列語(yǔ)句序列3 /無(wú)論是否捕獲到異常,最后必須執(zhí)行的代碼塊無(wú)論是否捕獲到異常,最后必須執(zhí)行的代碼塊1. 異常處理語(yǔ)句語(yǔ)法異常處理語(yǔ)句語(yǔ)法 217.2.1 try-catch-finally語(yǔ)句語(yǔ)句n說(shuō)明說(shuō)明n多個(gè)多個(gè)catch子句需要按異常類(lèi)子句需要按異常類(lèi)從子類(lèi)到父類(lèi)從子類(lèi)到父類(lèi)的次序依次的次序依次排列。排列。n若所有若所有catch子句都沒(méi)有捕獲子句都沒(méi)有捕獲e,則則e將由將由Java虛擬機(jī)捕虛擬機(jī)捕獲并處理,導(dǎo)致程序運(yùn)行終止,就像沒(méi)有使用獲并處理,導(dǎo)致程序運(yùn)行終止,就像沒(méi)有使用try語(yǔ)句。語(yǔ)句。

20、因此,因此,通常最后一個(gè)通常最后一個(gè)catch子句的異常類(lèi)是子句的異常類(lèi)是Exception。ntry 塊不能單獨(dú)存在塊不能單獨(dú)存在,后面必須跟,后面必須跟catch塊或塊或finally塊。塊。n如果程序某處發(fā)生異常,則如果程序某處發(fā)生異常,則try語(yǔ)句中語(yǔ)句中此處之后的代碼此處之后的代碼都都不會(huì)不會(huì)被執(zhí)行被執(zhí)行。22例如:例如:try String s=“abc”; int i=Integer.parseInt(s); /此語(yǔ)句存在異常,所以放在此語(yǔ)句存在異常,所以放在try語(yǔ)句中語(yǔ)句中 int a=i+10; /位于異常發(fā)生處之后,不會(huì)被執(zhí)行位于異常發(fā)生處之后,不會(huì)被執(zhí)行7.2.1 tr

21、y-catch-finally語(yǔ)句語(yǔ)句237.2.1 try-catch-finally語(yǔ)句語(yǔ)句n說(shuō)明說(shuō)明nfinally塊是塊是無(wú)論是否出現(xiàn)異常,都會(huì)運(yùn)行的塊無(wú)論是否出現(xiàn)異常,都會(huì)運(yùn)行的塊。n通常在通常在finally塊中可以塊中可以編寫(xiě)資源返還給系統(tǒng)的語(yǔ)句編寫(xiě)資源返還給系統(tǒng)的語(yǔ)句,通,通常,這些語(yǔ)句常,這些語(yǔ)句包括但不限于包括但不限于:釋放動(dòng)態(tài)分配的內(nèi)存塊釋放動(dòng)態(tài)分配的內(nèi)存塊關(guān)閉文件關(guān)閉文件關(guān)閉數(shù)據(jù)庫(kù)結(jié)果集關(guān)閉數(shù)據(jù)庫(kù)結(jié)果集關(guān)閉與數(shù)據(jù)庫(kù)建立的連接關(guān)閉與數(shù)據(jù)庫(kù)建立的連接24例如:例如:調(diào)用調(diào)用parseInt()方法的異常處理語(yǔ)句如下:方法的異常處理語(yǔ)句如下:String str = 123a

22、;try int i = Integer.parseInt(str); /調(diào)用聲明拋出異常的方法調(diào)用聲明拋出異常的方法catch (NumberFormatException e) /捕獲捕獲parseInt()方法聲明的異常對(duì)象方法聲明的異常對(duì)象 System.out.println(str+字符串不能轉(zhuǎn)換為整數(shù)字符串不能轉(zhuǎn)換為整數(shù));catch (Exception e) /捕獲所有異常對(duì)象捕獲所有異常對(duì)象 e.printStackTrace(); /顯示異常棧跟蹤信息顯示異常棧跟蹤信息7.2.1 try-catch-finally語(yǔ)句語(yǔ)句25圖圖 異常處理語(yǔ)句的執(zhí)行流程異常處理語(yǔ)句的執(zhí)行

23、流程7.2.1 try-catch-finally語(yǔ)句語(yǔ)句26(1) 正常情況下正常情況下(即沒(méi)有產(chǎn)生異常時(shí)即沒(méi)有產(chǎn)生異常時(shí)) (2) 捕獲異常并處理捕獲異常并處理 首先執(zhí)行首先執(zhí)行try子句中的語(yǔ)句序列;子句中的語(yǔ)句序列; 若若沒(méi)有產(chǎn)生異常沒(méi)有產(chǎn)生異常則則跳過(guò)跳過(guò)catch子句子句, 再執(zhí)行再執(zhí)行finally子句中的語(yǔ)句序列;子句中的語(yǔ)句序列; 然后繼續(xù)執(zhí)行然后繼續(xù)執(zhí)行后面的語(yǔ)句。后面的語(yǔ)句。catch子句說(shuō)明:子句說(shuō)明: catch語(yǔ)句可以有語(yǔ)句可以有多個(gè)多個(gè),分別處理,分別處理不同類(lèi)的不同類(lèi)的異常。異常。2. try語(yǔ)句執(zhí)行流程語(yǔ)句執(zhí)行流程7.2.1 try-catch-finally

24、語(yǔ)句語(yǔ)句27(2) 捕獲異常并處理捕獲異常并處理 執(zhí)行執(zhí)行try子句子句出現(xiàn)出現(xiàn)運(yùn)行錯(cuò)運(yùn)行錯(cuò)時(shí),時(shí),Java拋出一個(gè)異常對(duì)象拋出一個(gè)異常對(duì)象e, Java按照按照多個(gè)多個(gè)catch子句的子句的書(shū)寫(xiě)次序從上向下書(shū)寫(xiě)次序從上向下依次查找每個(gè)依次查找每個(gè)catch子句中子句中的異常類(lèi),一旦的異常類(lèi),一旦異常對(duì)象異常對(duì)象e是某個(gè)是某個(gè)catch子句的異常類(lèi)或其子類(lèi)實(shí)子句的異常類(lèi)或其子類(lèi)實(shí)例例,則被該,則被該catch子句捕獲并處理,子句捕獲并處理,一個(gè)異常對(duì)象一個(gè)異常對(duì)象只能被一個(gè)只能被一個(gè)catch子句捕獲子句捕獲,之后,之后Java將將自動(dòng)清除自動(dòng)清除該異常對(duì)象該異常對(duì)象,其它其它c(diǎn)atch子句子

25、句或或外外層的層的try語(yǔ)句語(yǔ)句將將不能不能再捕獲該異常對(duì)象。再捕獲該異常對(duì)象。多個(gè)多個(gè)catch子句需要子句需要按異常類(lèi)按異常類(lèi)從子類(lèi)到父類(lèi)的次序從子類(lèi)到父類(lèi)的次序依次排列依次排列。2. try語(yǔ)句執(zhí)行流程語(yǔ)句執(zhí)行流程7.2.1 try-catch-finally語(yǔ)句語(yǔ)句28(2) 捕獲異常并處理捕獲異常并處理 n如果如果所有所有catch子句都子句都沒(méi)有沒(méi)有捕獲捕獲e,則,則e將由將由Java虛擬機(jī)捕獲并虛擬機(jī)捕獲并 處理,導(dǎo)致程序處理,導(dǎo)致程序運(yùn)行終止運(yùn)行終止,就像沒(méi)有使用就像沒(méi)有使用try語(yǔ)句。語(yǔ)句。= 因此,通常因此,通常最后一個(gè)最后一個(gè)catch子句子句的的異常類(lèi)參數(shù)異常類(lèi)參數(shù)聲明

26、為聲明為Exception, 這樣這樣能夠保證能夠保證捕獲和處理所有異常對(duì)象。捕獲和處理所有異常對(duì)象。2. try語(yǔ)句執(zhí)行流程語(yǔ)句執(zhí)行流程7.2.1 try-catch-finally語(yǔ)句語(yǔ)句29(3) 執(zhí)行執(zhí)行finally子句子句 finally子句中的語(yǔ)句系列是子句中的語(yǔ)句系列是最后最后必須執(zhí)行必須執(zhí)行的代碼,無(wú)論的代碼,無(wú)論是否是否產(chǎn)生產(chǎn)生異常。異常。 當(dāng)當(dāng)try子句中的某條語(yǔ)句產(chǎn)生一個(gè)異常時(shí),子句中的某條語(yǔ)句產(chǎn)生一個(gè)異常時(shí),該語(yǔ)句該語(yǔ)句之后的之后的語(yǔ)句序列都將語(yǔ)句序列都將不會(huì)不會(huì)被執(zhí)行被執(zhí)行。如果有些語(yǔ)句如果有些語(yǔ)句肯定需要被執(zhí)行肯定需要被執(zhí)行,不管是否產(chǎn)生了異常不管是否產(chǎn)生了異常,

27、則這些語(yǔ)句,則這些語(yǔ)句需要寫(xiě)在需要寫(xiě)在finally子句中子句中。 注:注:try-catch- finally 語(yǔ)句的結(jié)構(gòu)語(yǔ)句的結(jié)構(gòu)使使正常執(zhí)行的語(yǔ)句正常執(zhí)行的語(yǔ)句與與異常處理異常處理的語(yǔ)句的語(yǔ)句分離分離,增強(qiáng)了增強(qiáng)了程序的程序的可讀性可讀性。 2. try語(yǔ)句執(zhí)行流程語(yǔ)句執(zhí)行流程7.2.1 try-catch-finally語(yǔ)句語(yǔ)句30【例例7.1】try-catch- finally 語(yǔ)句舉例語(yǔ)句舉例: Sample_1.java TestException.java 3. 舉例舉例7.2.1 try-catch-finally語(yǔ)句語(yǔ)句317.2.2 用用throw拋出自定義異常對(duì)象拋出

28、自定義異常對(duì)象n一個(gè)異常對(duì)象一個(gè)異常對(duì)象可由可由Java虛擬機(jī)拋出虛擬機(jī)拋出,也可由也可由程序程序主動(dòng)拋出主動(dòng)拋出。若程序中存在。若程序中存在邏輯錯(cuò)誤邏輯錯(cuò)誤,但,但不是不是Java的異常,的異常,程序程序可可主動(dòng)拋出主動(dòng)拋出一個(gè)異常對(duì)象一個(gè)異常對(duì)象。n語(yǔ)法格式:語(yǔ)法格式:throw 異常對(duì)象異常對(duì)象n由由throw語(yǔ)句拋出的異常也語(yǔ)句拋出的異常也必須必須由由try語(yǔ)句捕獲并語(yǔ)句捕獲并處理處理。異常拋出和處理。異常拋出和處理既可既可在一個(gè)方法中在一個(gè)方法中,也可也可分分別在不同的方法中別在不同的方法中。327.2.2 用用throw拋出自定義異常對(duì)象拋出自定義異常對(duì)象n舉例:舉例:public void set(int age) if (age0 & age100) this.age=age; else throw new Exception(“I

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論