hebaofeng_第06章JAVA異常處理_2012100895853_第1頁(yè)
hebaofeng_第06章JAVA異常處理_2012100895853_第2頁(yè)
hebaofeng_第06章JAVA異常處理_2012100895853_第3頁(yè)
hebaofeng_第06章JAVA異常處理_2012100895853_第4頁(yè)
hebaofeng_第06章JAVA異常處理_2012100895853_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第6章章 JAVA異常處理異常處理Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理第第6章章 JAVA異常處理異常處理6.1 異常的概念異常的概念6.2 異常處理異常處理6.3 自定義異常自定義異常Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理生活中的異常生活中的異常正常情況下,小王每日開(kāi)車(chē)去上班,耗時(shí)大約正常情況下,小王每日開(kāi)車(chē)去上班,耗時(shí)大約30分鐘分鐘但是,異常情況遲早要發(fā)生!但是,異常情況遲早要發(fā)生!一路暢通一路暢通堵車(chē)!堵車(chē)!撞車(chē)!撞車(chē)!Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理什么是異常什么是異常異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的

2、不正常的事件,它會(huì)異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的不正常的事件,它會(huì)中斷正在運(yùn)行的程序中斷正在運(yùn)行的程序繞行或者等待繞行或者等待請(qǐng)求交警解決請(qǐng)求交警解決異常!異常!面對(duì)異常該怎么辦呢?通常情況下,我們會(huì)這樣處理:面對(duì)異常該怎么辦呢?通常情況下,我們會(huì)這樣處理:程序運(yùn)行程序運(yùn)行程序中斷運(yùn)行程序中斷運(yùn)行堵車(chē)!堵車(chē)!撞車(chē)!撞車(chē)!生活中,我們會(huì)根據(jù)不同的異常進(jìn)行相應(yīng)的處理,生活中,我們會(huì)根據(jù)不同的異常進(jìn)行相應(yīng)的處理,而不會(huì)就此中斷我們的生活而不會(huì)就此中斷我們的生活Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理6.1 異常的概念異常的概念1.1.什么是異常?什么是異常? 異常是在程序運(yùn)

3、行過(guò)程中所發(fā)生的破壞了正常異常是在程序運(yùn)行過(guò)程中所發(fā)生的破壞了正常的指令流程的事件。軟件和硬件錯(cuò)誤都可能導(dǎo)致的指令流程的事件。軟件和硬件錯(cuò)誤都可能導(dǎo)致異常的產(chǎn)生。異常的產(chǎn)生。 程序運(yùn)行出現(xiàn)異常時(shí),程序運(yùn)行出現(xiàn)異常時(shí),JavaJava運(yùn)行環(huán)境就用異常運(yùn)行環(huán)境就用異常類(lèi)類(lèi)ExceptionException的相應(yīng)子類(lèi)創(chuàng)建一個(gè)異常對(duì)象,并等的相應(yīng)子類(lèi)創(chuàng)建一個(gè)異常對(duì)象,并等待處理待處理Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理程序中的異常程序中的異常public class ExcepNoCatch public static void main(String args) int

4、i = 0;String greetings = Hello world!, No, I mean it!, HELLO WORLD! ; while (i 4) System. out. println (greetings i); i+; Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理什么是異常處理什么是異常處理Java編程語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤編程語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力處理的能力程序中預(yù)先想好了程序中預(yù)先想好了 對(duì)付異常的處理辦法對(duì)付異常的處理辦法 異常!異常! 程序運(yùn)行程序運(yùn)行處理完畢,程序繼續(xù)運(yùn)行處理完畢,程序繼續(xù)運(yùn)行對(duì)異常進(jìn)行處

5、理對(duì)異常進(jìn)行處理Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理2Java處理異常的機(jī)制處理異常的機(jī)制異常處理可分為以下幾個(gè)步驟異常處理可分為以下幾個(gè)步驟: :1 1)拋出異常拋出異常:當(dāng)方法中有一個(gè)錯(cuò)誤發(fā)生后,該方法:當(dāng)方法中有一個(gè)錯(cuò)誤發(fā)生后,該方法創(chuàng)建一個(gè)異常對(duì)象并把它交給運(yùn)行時(shí)系統(tǒng)。創(chuàng)建一個(gè)異常對(duì)象并把它交給運(yùn)行時(shí)系統(tǒng)。2 2)捕獲異常:捕獲異常: 運(yùn)行時(shí)系統(tǒng)在方法調(diào)用堆棧里為被運(yùn)行時(shí)系統(tǒng)在方法調(diào)用堆棧里為被拋出的異常查找處理代碼。拋出的異常查找處理代碼。3 3)異常處理:異常處理:通過(guò)方法調(diào)用來(lái)處理異常通過(guò)方法調(diào)用來(lái)處理異常4 4)異常終止:異常終止:如果運(yùn)行時(shí)系統(tǒng)在方法

6、調(diào)用棧查遍了如果運(yùn)行時(shí)系統(tǒng)在方法調(diào)用棧查遍了所有的方法而未找到合適的異常處理程序,則運(yùn)所有的方法而未找到合適的異常處理程序,則運(yùn)行是系統(tǒng)終止執(zhí)行。行是系統(tǒng)終止執(zhí)行。Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理2Java處理異常的機(jī)制處理異常的機(jī)制異常發(fā)生異常發(fā)生拋出拋出異常異常JAVA虛虛擬機(jī)擬機(jī)強(qiáng)強(qiáng)制制拋拋出出生生動(dòng)動(dòng)自自成成異常類(lèi)異常類(lèi)對(duì)象對(duì)象異常處理異常處理代碼代碼捕獲捕獲異常異常捕捕獲獲異異常常異常類(lèi)異常類(lèi)對(duì)象對(duì)象終 止終 止程序程序Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理2Java處理異常的機(jī)制處理異常的機(jī)制可以靈活的處理異常,如果當(dāng)前方法有能

7、力處理異可以靈活的處理異常,如果當(dāng)前方法有能力處理異常,就捕獲并處理它,否則只需拋出異常,由方法常,就捕獲并處理它,否則只需拋出異常,由方法調(diào)用者來(lái)處理它。調(diào)用者來(lái)處理它。異常流程的代碼和正常流程的代碼分離,提高了程異常流程的代碼和正常流程的代碼分離,提高了程序的可讀性,簡(jiǎn)化了程序的結(jié)構(gòu)。序的可讀性,簡(jiǎn)化了程序的結(jié)構(gòu)。Java處理異常的機(jī)制的特點(diǎn):處理異常的機(jī)制的特點(diǎn):用用JavaJava類(lèi)來(lái)表示異常情況,這種類(lèi)被稱(chēng)為異常類(lèi)。類(lèi)來(lái)表示異常情況,這種類(lèi)被稱(chēng)為異常類(lèi)。把異常情況表示成異常類(lèi),可以充分發(fā)揮類(lèi)的可擴(kuò)把異常情況表示成異常類(lèi),可以充分發(fā)揮類(lèi)的可擴(kuò)展和可重用的優(yōu)勢(shì)。展和可重用的優(yōu)勢(shì)。Java

8、程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理JavaJava中異常類(lèi)的結(jié)構(gòu)中異常類(lèi)的結(jié)構(gòu)Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理Java中如何進(jìn)行異常處理中如何進(jìn)行異常處理Java的異常處理是通過(guò)的異常處理是通過(guò)5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:try、catch、 finally、throw、throws 捕獲異常捕獲異常 catchtryfinally執(zhí)行可能產(chǎn)生執(zhí)行可能產(chǎn)生 異常的代碼異常的代碼 捕獲異常捕獲異常 無(wú)論是否發(fā)生異常,無(wú)論是否發(fā)生異常,代碼總能執(zhí)行代碼總能執(zhí)行手動(dòng)拋出異常手動(dòng)拋出異常 拋出異常拋出異常 throw聲明異常聲明異常 聲明方法

9、可能要聲明方法可能要拋出的各種異常拋出的各種異常 throwsJava程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊塊-1trycatch try/catch 塊后的代碼段塊后的代碼段public void method()try / 代碼段代碼段(此處不會(huì)產(chǎn)生異常此處不會(huì)產(chǎn)生異常) catch (異常類(lèi)型異常類(lèi)型 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代碼段/ 代碼段代碼段使用使用try/catch塊捕獲異常,分為三種情況:塊捕獲異常,分為三種情況:第一種情況第一種情況 Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊

10、塊-2使用示例模擬第一種情況:使用示例模擬第一種情況:public class MyException public static void main(String args) System.out.print(請(qǐng)輸入課程代號(hào)請(qǐng)輸入課程代號(hào)(1至至3之間的數(shù)字之間的數(shù)字):);Scanner in = new Scanner(System.in);try int courseCode = in.nextInt();switch (courseCode) case 1: System.out.println(C#編程編程); break;case 2: System.out.println(Ja

11、va編程編程); break;case 3: System.out.println(SQL基礎(chǔ)基礎(chǔ)); catch (Exception ex) System.out.println(輸入不為數(shù)字輸入不為數(shù)字!);System.out.println(歡迎提出建議歡迎提出建議!);輸入:輸入:2Java編程編程歡迎提出建議歡迎提出建議!控制臺(tái)輸出控制臺(tái)輸出Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊塊-3trycatch異常類(lèi)型匹配異常類(lèi)型匹配 try/catch 塊后的代碼段塊后的代碼段進(jìn)入進(jìn)入catch塊塊public void method()try

12、 / 代碼段代碼段 1 / 產(chǎn)生異常的代碼段產(chǎn)生異常的代碼段 2 / 代碼段代碼段 3 catch (異常類(lèi)型異常類(lèi)型 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代碼段4/ 代碼段代碼段5使用使用try/catch塊捕獲異常,分為三種情況:塊捕獲異常,分為三種情況:第二種情況第二種情況 產(chǎn)生異常對(duì)象產(chǎn)生異常對(duì)象 程序繼續(xù)執(zhí)行程序繼續(xù)執(zhí)行異常是一種特殊的對(duì)象,異常是一種特殊的對(duì)象,類(lèi)型為類(lèi)型為java.lang.Exception或其子類(lèi)或其子類(lèi) 發(fā)生異常發(fā)生異常Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊塊-4使用示例模擬第二種情況:使用示例模擬第

13、二種情況:public class MyException public static void main(String args) System.out.print(請(qǐng)輸入課程代號(hào)請(qǐng)輸入課程代號(hào)(1至至3之間的數(shù)字之間的數(shù)字):);Scanner in = new Scanner(System.in);try int courseCode = in.nextInt();switch (courseCode) case 1:System.out.println(C#編程編程);break;case 2:System.out.println(Java編程編程);break;case 3:Syst

14、em.out.println(SQL基礎(chǔ)基礎(chǔ)); catch (Exception ex) System.out.println(輸入不為數(shù)字輸入不為數(shù)字!); ex.printStackTrace();System.out.println(歡迎提出建議歡迎提出建議!);輸入:輸入:B輸入不為數(shù)字輸入不為數(shù)字!異常堆棧信息異常堆棧信息歡迎提出建議歡迎提出建議!控制臺(tái)輸出控制臺(tái)輸出Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類(lèi)的執(zhí)行流程類(lèi)的執(zhí)行流程public class MyEx

15、ception public static void main(String args) System.out.print(請(qǐng)輸入課程代號(hào)請(qǐng)輸入課程代號(hào)(1至至3之間的數(shù)字之間的數(shù)字):); Scanner in = new Scanner(System.in); try int courseCode = in.nextInt(); /此處代碼省略此處代碼省略 catch (Exception ex) System.out.println(輸入不為數(shù)字!輸入不為數(shù)字!); ex.printStackTrace(); System.out.println(歡迎提出建議歡迎提出建議!); try/

16、catch塊塊-5java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:840)at java.util.Scanner.next(Scanner.java:1461)at java.util.Scanner.nextInt(Scanner.java:2091)at java.util.Scanner.nextInt(Scanner.java:2050)at s2jsp.sg.ch05. MyException.main(MyException.java:23)異常類(lèi)型異常類(lèi)型異常堆棧信息異常堆棧信

17、息在此方法中拋出了異常在此方法中拋出了異常Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊塊-6trycatch異常類(lèi)型不匹配異常類(lèi)型不匹配 try/catch 塊后的代碼段塊后的代碼段程序中斷運(yùn)行程序中斷運(yùn)行 發(fā)生異常發(fā)生異常public void method()try / 代碼段代碼段 1 / 產(chǎn)生異常的代碼段產(chǎn)生異常的代碼段 2 / 代碼段代碼段 3 catch (異常類(lèi)型異常類(lèi)型 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代碼段4/ 代碼段代碼段5使用使用try/catch塊捕獲異常,分為三種情況:塊捕獲異常,分為三種情況:第三種情況第三種情

18、況 產(chǎn)生異常對(duì)象產(chǎn)生異常對(duì)象 Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch塊塊-7使用示例模擬第三種情況:使用示例模擬第三種情況:public class MyException2 public static void main(String args) System.out.print(請(qǐng)輸入課程代號(hào)請(qǐng)輸入課程代號(hào)(1至至3之間的數(shù)字之間的數(shù)字):);Scanner in = new Scanner(System.in);try int courseCode = in.nextInt();switch (courseCode) case 1: System

19、.out.println(C#編程編程); break;case 2: System.out.println(Java編程編程); break;case 3: System.out.println(SQL基礎(chǔ)基礎(chǔ)); catch (NullPointerException ex) System.out.println(輸入不為數(shù)字!輸入不為數(shù)字!);System.out.println(歡迎提出建議!歡迎提出建議!);輸入:輸入:B程序中斷運(yùn)行程序中斷運(yùn)行Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理finally語(yǔ)句語(yǔ)句finally語(yǔ)句定義一個(gè)總是被執(zhí)行的代碼塊,而不管有沒(méi)

20、有出語(yǔ)句定義一個(gè)總是被執(zhí)行的代碼塊,而不管有沒(méi)有出現(xiàn)異?!,F(xiàn)異常。public void work() try 開(kāi)門(mén) 工作8個(gè)小時(shí) /可能會(huì)拋出異常 catch(DiseaseException e) 去醫(yī)院看病; finally 關(guān)門(mén) public void work() try 開(kāi)門(mén) 工作8個(gè)小時(shí)/可能會(huì)拋出異常 關(guān)門(mén) catch(DiseaseException e) 去醫(yī)院看病; Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch/finally -1在在try/catch塊后加入塊后加入finally塊,可以確保無(wú)論是否發(fā)生異常,塊,可以確保無(wú)論是否發(fā)生

21、異常,finally塊中的代碼總能被執(zhí)行塊中的代碼總能被執(zhí)行try 塊塊 finally 塊塊 catch 塊塊 無(wú)異常無(wú)異常 有異常有異常 Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理try/catch/finally-2 public class MyException3 public static void main(String args) System.out.print(請(qǐng)輸入課程代號(hào)請(qǐng)輸入課程代號(hào)(1至至3之間的數(shù)字之間的數(shù)字):);Scanner in = new Scanner(System.in);try int courseCode = in.nextI

22、nt();switch (courseCode) case 1: System.out.println(C#編程編程); break;case 2: System.out.println(Java編程編程); break;case 3: System.out.println(SQL基礎(chǔ)基礎(chǔ)); catch (Exception ex) System.out.println(輸入不為數(shù)字!輸入不為數(shù)字!); finally System.out.println(歡迎提出建議!歡迎提出建議!);輸入:輸入:2Java編程編程歡迎提出建議歡迎提出建議!控制臺(tái)輸出控制臺(tái)輸出輸入:輸入:B輸入不為數(shù)字輸

23、入不為數(shù)字!歡迎提出建議歡迎提出建議!第一種情況:第一種情況:無(wú)異常無(wú)異常第二種情況:第二種情況:有異常有異常 Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理編寫(xiě)一個(gè)類(lèi)編寫(xiě)一個(gè)類(lèi)ExceptionTest1,在,在main方法中使方法中使用用try、catch、finally: 在try塊中,編寫(xiě)被0除的代碼 在catch塊中,捕獲被0除所產(chǎn)生的異常,并且打印異常信息 在finally塊中,打印一條語(yǔ)句Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理多重多重catch塊塊-1一段代碼可能會(huì)引發(fā)多種類(lèi)型的異常一段代碼可能會(huì)引發(fā)多種類(lèi)型的異常當(dāng)引發(fā)異常時(shí),會(huì)按順序來(lái)查

24、看每個(gè)當(dāng)引發(fā)異常時(shí),會(huì)按順序來(lái)查看每個(gè) catch 語(yǔ)句,語(yǔ)句,并執(zhí)行第一個(gè)與異常類(lèi)型匹配的并執(zhí)行第一個(gè)與異常類(lèi)型匹配的catch語(yǔ)句語(yǔ)句執(zhí)行其中的一條執(zhí)行其中的一條 catch 語(yǔ)句之后,其后的語(yǔ)句之后,其后的 catch 語(yǔ)句將被忽略語(yǔ)句將被忽略Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理public void method()try / 代碼段代碼段 / 產(chǎn)生異常產(chǎn)生異常(異常類(lèi)型異常類(lèi)型2) catch (異常類(lèi)型異常類(lèi)型1 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代碼段 catch (異常類(lèi)型異常類(lèi)型2 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代

25、碼段 catch (異常類(lèi)型異常類(lèi)型3 ex) / 對(duì)異常進(jìn)行處理的代碼段對(duì)異常進(jìn)行處理的代碼段/ 代碼段代碼段多重多重catch塊塊 -2try 與異常類(lèi)型與異常類(lèi)型1不匹配不匹配try/catch 塊后的代碼段塊后的代碼段發(fā)生異常發(fā)生異常產(chǎn)生異常對(duì)象產(chǎn)生異常對(duì)象catch與異常類(lèi)型與異常類(lèi)型2匹配匹配catchcatch程序繼續(xù)執(zhí)行程序繼續(xù)執(zhí)行進(jìn)入進(jìn)入catch塊塊Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理多重多重catch塊塊-3public class MyException4 public static void main(String args) Scanner

26、 in = new Scanner(System.in);trySystem.out.print(“請(qǐng)輸入互聯(lián)網(wǎng)專(zhuān)業(yè)的總學(xué)時(shí):請(qǐng)輸入互聯(lián)網(wǎng)專(zhuān)業(yè)的總學(xué)時(shí):);int totalTime = in.nextInt(); /總學(xué)時(shí)總學(xué)時(shí)System.out.print(“請(qǐng)輸入互聯(lián)網(wǎng)專(zhuān)業(yè)的課程數(shù)目:請(qǐng)輸入互聯(lián)網(wǎng)專(zhuān)業(yè)的課程數(shù)目:);int totalCourse = in.nextInt(); /課程數(shù)目課程數(shù)目System.out.println(“互聯(lián)網(wǎng)專(zhuān)業(yè)的各課程的平均學(xué)時(shí)為:互聯(lián)網(wǎng)專(zhuān)業(yè)的各課程的平均學(xué)時(shí)為: + totalTime / totalCourse); catch (InputMis

27、matchException e1) System.out.println(輸入不為數(shù)字輸入不為數(shù)字!); catch (ArithmeticException e2) System.out.println(課程數(shù)目不能為零課程數(shù)目不能為零!); catch (Exception e) System.out.println(發(fā)生錯(cuò)誤發(fā)生錯(cuò)誤:+e.getMessage();輸入:輸入:270 H 在安排在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常, 然后再逐漸一般化,即先子類(lèi)后父類(lèi)然后再逐漸一般化,即先子類(lèi)后父類(lèi) 輸出:輸出:輸入不為數(shù)字輸入不

28、為數(shù)字!進(jìn)入第一個(gè)進(jìn)入第一個(gè)catch塊塊輸入:輸入:270 0 輸出:輸出:課程數(shù)目不能為零課程數(shù)目不能為零!進(jìn)入第二個(gè)進(jìn)入第二個(gè)catch塊塊Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理聲明異常聲明異常如果一個(gè)方法不想處理異常,或者異常沒(méi)有在當(dāng)前如果一個(gè)方法不想處理異常,或者異常沒(méi)有在當(dāng)前的的try catch中處理,則它必須將異常拋棄給上一中處理,則它必須將異常拋棄給上一級(jí)調(diào)用它的方法。級(jí)調(diào)用它的方法。可以通過(guò)可以通過(guò)throws 語(yǔ)句將異常拋語(yǔ)句將異常拋向上級(jí)調(diào)用方法。向上級(jí)調(diào)用方法。如果異常被回溯到如果異常被回溯到main方法仍舊沒(méi)有處理,則程序方法仍舊沒(méi)有處理,則

29、程序?qū)⒊鲥e(cuò),終止運(yùn)行。將出錯(cuò),終止運(yùn)行。Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理聲明異常聲明異常public class ExTester static int method1(int x) throws Exception if(x0)throw new Exception(x0); return +x; static int method2(int x)throws Exception return method1(x); public static void main(String args)throws Exception System.out.println(m

30、ethod2(-1); main()method2()method1()方法調(diào)用堆棧異常處理采用堆棧機(jī)制Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理聲明異常聲明異常public class Teacher private String id;/ 教師編號(hào)教師編號(hào),長(zhǎng)度應(yīng)為長(zhǎng)度應(yīng)為7 public void setId(String pId) throws IllegalArgumentException / 判斷教師編號(hào)的長(zhǎng)度是否為判斷教師編號(hào)的長(zhǎng)度是否為7 if (pId.length() = 7) id = pId; else throw new IllegalArgum

31、entException(參數(shù)長(zhǎng)度應(yīng)為參數(shù)長(zhǎng)度應(yīng)為7!); public class TeacherTest public static void main(String args) Teacher teacher = new Teacher();try teacher.setId(088); catch (IllegalArgumentException ex) System.out.println(ex.getMessage(); 由調(diào)用者捕獲異常由調(diào)用者捕獲異常 聲明該方法可能會(huì)產(chǎn)生異常聲明該方法可能會(huì)產(chǎn)生異常 Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理拋出異常拋出異

32、常在JAVA程序中,引發(fā)異常共有以下兩種方式l使用顯式 throw 語(yǔ)句來(lái)引發(fā)異常。在此情況下,控制權(quán)將無(wú)條件轉(zhuǎn)到處理異常的部分代碼l使用語(yǔ)句或表達(dá)式在執(zhí)行過(guò)程中激發(fā)了某個(gè)異常的條件,使得操作無(wú)法正常結(jié)束,從而引發(fā)異常throw語(yǔ)句用于立即無(wú)條件地引發(fā)異常,語(yǔ)法格式為:throw 異常對(duì)象;Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理拋出異常拋出異常如果在當(dāng)前環(huán)境無(wú)法解決一個(gè)異常,就要將其拋出,把異常如果在當(dāng)前環(huán)境無(wú)法解決一個(gè)異常,就要將其拋出,把異常交給調(diào)用者處理交給調(diào)用者處理 public class Teacher private String id; / 教師編號(hào),長(zhǎng)

33、度應(yīng)為教師編號(hào),長(zhǎng)度應(yīng)為7 public void setId(String pId) / 判斷教師編號(hào)的長(zhǎng)度是否為判斷教師編號(hào)的長(zhǎng)度是否為7 if (pId.length() = 7) id = pId; else throw new IllegalArgumentException(參數(shù)長(zhǎng)度應(yīng)為參數(shù)長(zhǎng)度應(yīng)為7!); public class TeacherTest public static void main(String args) Teacher teacher = new Teacher(); try teacher.setId(088); catch (IllegalArgume

34、ntException ex) System.out.println(ex.getMessage(); 拋出異常拋出異常捕獲異常捕獲異常參數(shù)長(zhǎng)度應(yīng)為參數(shù)長(zhǎng)度應(yīng)為7!控制臺(tái)輸出控制臺(tái)輸出Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理編寫(xiě)類(lèi)編寫(xiě)類(lèi)ExceptionTest2: 定義兩個(gè)方法:go()和main() 在go方法中聲明要拋出異常,在該方法體內(nèi),拋出一個(gè)Exception對(duì)象 在main()方法中,調(diào)用go方法,使用try/catch捕獲go方法中拋出的異常Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理自定義異常類(lèi)自定義異常類(lèi)使用自定義異常的步驟:使用自定

35、義異常的步驟:1.通過(guò)繼承通過(guò)繼承java.lang.Exception類(lèi)聲明自己的異常類(lèi);類(lèi)聲明自己的異常類(lèi);2.在方法中生成自定義異常的實(shí)例,并用在方法中生成自定義異常的實(shí)例,并用throw語(yǔ)句拋出;語(yǔ)句拋出;3.在方法的聲明部分用在方法的聲明部分用throws語(yǔ)句聲明該方法可能拋出的異語(yǔ)句聲明該方法可能拋出的異常常import java.io.* ;class MyException extends Exception private int id ; public MyException(String message ,int id) super(message) ; this.id

36、= id ; public int getId() return id ; Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理public class TestMyException public void regist(int num) throws MyException if(num 0) throw new MyException(人數(shù)不能為負(fù)值人數(shù)不能為負(fù)值,3) ; System.out.println(人數(shù):人數(shù): + num) ; public void manager() try regist(-100) ; catch(MyException e) System

37、.out.println(錯(cuò)誤!錯(cuò)誤代碼:錯(cuò)誤!錯(cuò)誤代碼: + e.getId() ; e.printStackTrace() ; System.out.println(操作結(jié)束操作結(jié)束) ; public static void main(String args) TestMyException t = new TestMyException() ; t.manager() ; Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理用戶(hù)定義異常用戶(hù)定義異常用戶(hù)定義異常是通過(guò)擴(kuò)展用戶(hù)定義異常是通過(guò)擴(kuò)展Exception類(lèi)或類(lèi)或RuntimeException來(lái)創(chuàng)建的。來(lái)創(chuàng)建的。 cla

38、ss AnswerWrongException extends Exception private int result; public AnswerWrongException (int result) this.result=result; public int getResult() return result; Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理用戶(hù)定義異常用戶(hù)定義異常public class ExceptionTester public static void test(int x,int y,int z)throws AnswerWrongExcepti

39、on if(x+y!=z) throw new AnswerWrongException(z); System.out.println(x+y+=+z); public static void main(String args) try test(1,2,5); System.out.println(end); catch( AnswerWrongException e) System.out.println(result is wrong:+e.getResult(); e.printStackTrace(); Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理獲得異常信息獲得異

40、常信息Exception提供了如下方法:提供了如下方法: toString() getMessage() printStackTrace()try test(1,2,5); System.out.println(end); catch( AnswerWrongException e) e.printStackTrace(); Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理異常處理流程異常處理流程finally語(yǔ)句不被執(zhí)行的唯一情況是程序先執(zhí)行了終止程序的語(yǔ)句不被執(zhí)行的唯一情況是程序先執(zhí)行了終止程序的System.exit()方法方法public static void main

41、(String args) try System.out.println(Begin); System.exit(0); finally System.out.println(Finally); System.out.println(End);Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理異常處理流程異常處理流程public static void main(String args)throws Exception try System.out.println(Begin); new Sample().method1(-1); /出現(xiàn)出現(xiàn)SpecialException異常異常

42、 System.exit(0); catch(Exception e) System.out.println(Wrong); throw e; /如果把此行注釋掉,將得到不同的運(yùn)行結(jié)果如果把此行注釋掉,將得到不同的運(yùn)行結(jié)果 finally System.out.println(Finally); System.out.println(End);打印Begin Wrong Finallyjava.lang.SpecialException Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理異常處理流程異常處理流程public static int method1(int x) try

43、 if(x0)throw new Exception(x0); return x+; catch(Exception e) System.out.println(“Wrong); return -100; finally System.out.println(Finally); public static void main(String args) System.out.println( method1(-1)); 打印Wrong Finally-100Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理常見(jiàn)異常常見(jiàn)異常ArithmeticException:數(shù)學(xué)異常:數(shù)學(xué)異常in

44、t a=12 / 0; /拋出拋出ArithmeticExceptionNullPointerException:空指針異常:空指針異常Date d= null;System.out.println(d.toString(); /拋出拋出NullPointerExceptionArrayIndexOutOfBoundsException:下標(biāo)越界異常:下標(biāo)越界異常int array=new int4;array0=1; array7=1; /拋出拋出ArrayIndexOutOfBoundsExceptionClassCastException:類(lèi)型轉(zhuǎn)換異常:類(lèi)型轉(zhuǎn)換異常:Animal ani

45、mal=new Dog();Cat cat=(Animal)animal;Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理運(yùn)行時(shí)異常運(yùn)行時(shí)異常 RuntimeException類(lèi)及其子類(lèi)都稱(chēng)為運(yùn)行時(shí)異常,這種異類(lèi)及其子類(lèi)都稱(chēng)為運(yùn)行時(shí)異常,這種異常的特點(diǎn)是常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類(lèi)異常,即使沒(méi)有用可能出現(xiàn)這類(lèi)異常,即使沒(méi)有用try-catch語(yǔ)句捕獲它,也語(yǔ)句捕獲它,也沒(méi)有用沒(méi)有用throws子句聲明拋出它,也會(huì)編譯通過(guò)。例如當(dāng)以子句聲明拋出它,也會(huì)編譯通過(guò)。例如當(dāng)以下下divide()方法的參數(shù)方法的參數(shù)

46、b為為0,執(zhí)行,執(zhí)行“a/b”操作時(shí)會(huì)出現(xiàn)操作時(shí)會(huì)出現(xiàn)ArrithmeticException異常,它屬于運(yùn)行時(shí)異常,異常,它屬于運(yùn)行時(shí)異常,Java編編譯器不會(huì)檢查它:譯器不會(huì)檢查它:public int divide(int a,int b) return a/b; /當(dāng)參數(shù)當(dāng)參數(shù)b為為0,拋出,拋出ArrithmeticException Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理區(qū)分運(yùn)行時(shí)異常和受檢查異常區(qū)分運(yùn)行時(shí)異常和受檢查異常運(yùn)行時(shí)異常表示無(wú)法讓程序恢復(fù)運(yùn)行的異常,導(dǎo)致這種異常運(yùn)行時(shí)異常表示無(wú)法讓程序恢復(fù)運(yùn)行的異常,導(dǎo)致這種異常的原因通常是由于執(zhí)行了錯(cuò)誤操作。一

47、旦出現(xiàn)了錯(cuò)誤操作,的原因通常是由于執(zhí)行了錯(cuò)誤操作。一旦出現(xiàn)了錯(cuò)誤操作,建議終止程序,因此建議終止程序,因此Java編譯器不檢查這種異常。編譯器不檢查這種異常。 public void method(int array) for(int i=0;i=array.length;i+) /當(dāng)i的取值為array.length時(shí),將拋出ArrayIndexOutOfBoundsException arrayi=1;public void method(int array) for(int i=0;iarray.length;i+) arrayi=1; /不會(huì)拋出ArrayIndexOutOfBound

48、sException修改程序代碼中的錯(cuò)誤Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理區(qū)分運(yùn)行時(shí)異常和受檢查異常區(qū)分運(yùn)行時(shí)異常和受檢查異常受檢查異常表示程序可以處理的異常,如果拋出異常的方法本受檢查異常表示程序可以處理的異常,如果拋出異常的方法本身不能處理它,那么方法調(diào)用者應(yīng)該去處理它,從而使程身不能處理它,那么方法調(diào)用者應(yīng)該去處理它,從而使程序恢復(fù)運(yùn)行,不至于終止程序。序恢復(fù)運(yùn)行,不至于終止程序。 如果一個(gè)方法可能出現(xiàn)受檢查異常,要么用如果一個(gè)方法可能出現(xiàn)受檢查異常,要么用try-catch語(yǔ)句捕語(yǔ)句捕獲,要么用獲,要么用throws子句聲明將它拋出,否則會(huì)導(dǎo)致編譯錯(cuò)子句聲明

49、將它拋出,否則會(huì)導(dǎo)致編譯錯(cuò)誤。誤。 void method1() throws IOException /合法/編譯錯(cuò)誤,必須捕獲或聲明拋出IOExceptionvoid method2() method1(); /合法,聲明拋出IOException void method3()throws IOException method1(); /合法,聲明拋出Exceptionvoid method4()throws Exception method1(); /合法,捕獲IOException void method5() try method1(); catch(IOException e)Java程序設(shè)計(jì)程序設(shè)計(jì) 第第6章章 JAVA異常處理異常處理程序調(diào)試程序調(diào)試9-1令狐沖鍥而不舍地練,但還是不令人滿(mǎn)意。怎么回事呢?令狐沖鍥而不舍地練,但還是不令人滿(mǎn)意。怎么回事呢?他仔細(xì)地分析,哪一步出錯(cuò)了呢?他仔細(xì)地分析,哪一步出錯(cuò)了呢?歌唱得不好?鋼琴演奏不過(guò)關(guān)?歌唱得不好?鋼琴演奏不過(guò)關(guān)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論