




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、本章將介紹Java語(yǔ)言中的高級(jí)特性:什么是異常異常處理、異常處理提供對(duì)錯(cuò)誤的捕捉和處理機(jī)制什么是異常(Java編程中的錯(cuò)誤)異常和異常類(lèi)異常的拋出異常的處理1編譯錯(cuò)誤 編譯錯(cuò)誤是由于編寫(xiě)的程序存在語(yǔ)法問(wèn)題,未能通過(guò)編譯產(chǎn)生的,它由語(yǔ)言的編譯系統(tǒng)負(fù)責(zé)檢測(cè)和報(bào)告。 沒(méi)有編譯錯(cuò)誤是一個(gè)程序能正常運(yùn)行的基本條件,只有所有的編譯錯(cuò)誤都改正了,源代碼才可以被成功地編譯成目標(biāo)碼或字節(jié)碼 2運(yùn)行錯(cuò)誤 運(yùn)行錯(cuò)誤是在程序的運(yùn)行過(guò)程中產(chǎn)生的錯(cuò)誤。根據(jù)性質(zhì)不同運(yùn)行錯(cuò)誤還可以分為系統(tǒng)運(yùn)行錯(cuò)誤和邏輯運(yùn)行錯(cuò)誤。 系統(tǒng)運(yùn)行錯(cuò)誤系統(tǒng)運(yùn)行錯(cuò)誤是指程序在執(zhí)行過(guò)程中引發(fā)了操作系統(tǒng)的問(wèn)題 所以不排除系統(tǒng)錯(cuò)誤,程序就不能正常地工作 邏輯
2、運(yùn)行錯(cuò)誤邏輯運(yùn)行錯(cuò)誤是指程序不能實(shí)現(xiàn)編程人員的設(shè)計(jì)意圖和設(shè)計(jì)功能而產(chǎn)生的錯(cuò)誤 Java的運(yùn)行錯(cuò)誤就是Java的異常。異常是在一個(gè)程序執(zhí)行過(guò)程中,阻礙程序指令流的正常運(yùn)行一個(gè)錯(cuò)誤事件。當(dāng)一個(gè)方法中有錯(cuò)誤發(fā)生的時(shí)候,方法就會(huì)創(chuàng)建一個(gè)對(duì)象并把它傳遞給運(yùn)行系統(tǒng)。這個(gè)對(duì)象就稱(chēng)為異常對(duì)象,異常對(duì)象包含了錯(cuò)誤信息,包括錯(cuò)誤類(lèi)型、錯(cuò)誤發(fā)生時(shí)候程序的狀態(tài)。而這樣的一個(gè)創(chuàng)建異常對(duì)象和傳遞對(duì)象個(gè)運(yùn)行系統(tǒng)的過(guò)程就稱(chēng)為拋出異常。運(yùn)行系統(tǒng)會(huì)在調(diào)用堆棧中尋找處理異常的代碼。這些代碼稱(chēng)為異常處理器(Exception Handler)。查找異常處理器是從調(diào)用堆棧中從發(fā)現(xiàn)錯(cuò)誤的方法開(kāi)始反向進(jìn)行的。當(dāng)異常處理器(異常處理程序段)
3、被發(fā)現(xiàn),運(yùn)行系統(tǒng)將異常傳遞給異常處理器。該異常處理器就可以處理拋出相對(duì)應(yīng)類(lèi)型的異常。這一過(guò)程就是捕捉異常(Catch an Exception)。如果沒(méi)有異常處理器,程序就會(huì)終止。異常是一個(gè)對(duì)象,它繼承自Throwable類(lèi),所有的Throwable類(lèi)的子孫類(lèi)所產(chǎn)生的對(duì)象都是例外.每個(gè)異常類(lèi)都代表了一種運(yùn)行錯(cuò)誤,異常類(lèi)中包含了該運(yùn)行錯(cuò)誤的信息和處理錯(cuò)誤的方法等內(nèi)容 Java的異常處理機(jī)制 每當(dāng)Java程序運(yùn)行過(guò)程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),(即該錯(cuò)誤有一個(gè)異常類(lèi)與之相對(duì)應(yīng)時(shí)),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類(lèi)的對(duì)象,即產(chǎn)生一個(gè)異常。public class HelloWorld public
4、static void main (String args ) int i = 0;String greetings = Hello world!,No, I mean it!, HELLO WORLD!;while (i 100)throw (new MyException()); 2)含有throw的語(yǔ)句的方法,應(yīng)當(dāng)在方法頭定義中增加如下的部分: throws 要拋出的異常類(lèi)名列表這樣做主要是為了通知欲調(diào)用這個(gè)方法的上層方法,準(zhǔn)備接受和處理它在運(yùn)行中可能會(huì)拋出的異常 如果方法中的throw語(yǔ)句不止一個(gè),則應(yīng)該在方法頭throws中列出所有可能的異常 如: void MyMethod ()
5、throws MyException /可能在程序中拋出MyException異常if(I100)throw (new MyException()); 若某個(gè)方法MyMethod可能產(chǎn)生Exception1、Exception2和Exception3三種異常,而它們又都是Super_Exception類(lèi)的子類(lèi) Super_Exception Exception1 Exception2 Exception3 void MyMethod () throws Exception1,Exception2,Exception3 /可能在程序中拋出這三個(gè)異常 void MyMethod () throws
6、 Super_Exception /可能在程序中拋出這三個(gè)異常的父類(lèi)3)Java語(yǔ)言要求所有用throws關(guān)鍵字聲明的類(lèi)和用throw拋出的對(duì)象必須是Throwable類(lèi)或其子類(lèi)。如果你試圖拋出一個(gè)不是可拋出(Throwable)對(duì)象,Java編譯器將會(huì)報(bào)錯(cuò)。 異常實(shí)例: 程序中要用到一個(gè)Employee雇員類(lèi),這個(gè)Employee類(lèi)中有兩個(gè)屬性,分別是雇員的姓名m_EmpName和當(dāng)前工資m_EmpSalary, 在這個(gè)雇員類(lèi)上加了一些限制,固定雇員的工資不得低于工資的最低標(biāo)準(zhǔn)800元,雇員每次工資的變化幅度不得高于原工資的20。 為上面的限制定義了兩個(gè)用戶(hù)異常 IllegalSalaryE
7、xception IllegalSalryChangeException見(jiàn) 書(shū) 代 碼 E m p l o y e e . j a v a , I l l e g a l S a l a r y E x c e p t i o n . j a v a 和IllegalSalaryChangeException.java此時(shí),在雇員Employee類(lèi)中,雇員的構(gòu)造函數(shù)Employee()和修改工資的方法setEmpSalary()由于可能出現(xiàn)上面的兩種錯(cuò)誤,所以有可能拋出這兩種異常見(jiàn)書(shū)代碼Employee.java 主要考慮如何捕捉異常,捕捉異常后程序如何跳轉(zhuǎn),以及如何寫(xiě)異常處理語(yǔ)句1tryca
8、tchfinally 塊格式如下: try /可能出現(xiàn)異常的程序代碼語(yǔ)句1語(yǔ)句ncatch(異常類(lèi)型1,異常對(duì)象e1) /進(jìn)行異常類(lèi)型1的處理catch(異常類(lèi)型2,異常對(duì)象e2) /進(jìn)行異常類(lèi)型2的處理catch(異常類(lèi)型3,異常對(duì)象e3) /進(jìn)行異常類(lèi)型3的處理finally /其他處理程序代碼語(yǔ)句1語(yǔ)句n 1)try在try語(yǔ)句的 中包含了可能會(huì)拋出一個(gè)或多個(gè)異常的一段程序代碼這些代碼實(shí)際上指定了它后面的catch塊所能捕捉的異常的范圍。 Java程序運(yùn)行到try塊中的語(yǔ)句時(shí)如果產(chǎn)生了異常,就不再繼續(xù)執(zhí)行該try塊中其他的語(yǔ)句,而是直接進(jìn)入catch塊中尋找第一個(gè)與之匹配的異常類(lèi)型并進(jìn)行
9、處理。 2)catch塊catch語(yǔ)句的參數(shù)類(lèi)似于方法的定義,包括一個(gè)異常類(lèi)型和一個(gè)異常對(duì)象。異常類(lèi)型必須為T(mén)hrowable類(lèi)的子類(lèi),它指明了catch語(yǔ)句所處理的異常類(lèi)型;異常對(duì)象則由Java運(yùn)行時(shí)系統(tǒng)在try所指定的程序代碼塊中拋出的大括號(hào)中包含異常對(duì)象的處理的方法代碼。catch語(yǔ)句可以有多個(gè),分別處理不同類(lèi)型的異常。Java運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的異常類(lèi)型進(jìn)行檢測(cè),直到找到與之相匹配的catch語(yǔ)句為止。這里,類(lèi)型匹配指catch中的異常類(lèi)型與生成的異常對(duì)象的類(lèi)型完全一致或者是異常對(duì)象的父類(lèi),因此,catch語(yǔ)句的排序順序應(yīng)該是從特殊到一般。(考慮為什么?)
10、3)finally塊finally語(yǔ)句可以說(shuō)是為異常處理事件提供的一個(gè)清理機(jī)制,一般用來(lái)關(guān)閉文件或釋放其他系統(tǒng)資源 在try-catch-finally語(yǔ)句中可以沒(méi)有finally部分的語(yǔ)句。 如果沒(méi)有finally部分,則當(dāng)try指定的程序代碼拋出一個(gè)異常時(shí),其他的程序代碼就不會(huì)被執(zhí)行;如果存在finally部分,則不論try塊中是否發(fā)生了異常,是否執(zhí)行過(guò)catch部分的語(yǔ)句,都要執(zhí)行finally部分的語(yǔ)句??梢?jiàn),finally部分的語(yǔ)句為異常處理提供了一個(gè)統(tǒng)一的出口。例 1 0 . 2 t r y - c a t c h 捕 捉 和 處 理 異 常 :UserException.java
11、(部分) 異常拋出實(shí)例:例1:編寫(xiě)一個(gè)除法運(yùn)算器的應(yīng)用程序。public class DivideByZeroException extends ArithmeticException private String message=; public DivideByZeroException() super(請(qǐng)不要輸入0作為除數(shù)); message= 請(qǐng)不要輸入0作為除數(shù); public DivideByZeroException(String message) super(message); this.message=message; public String toString() ret
12、urn message; import javax.swing.*;import java.awt.*;import java.awt.event.*;public class DividebyZero extends JFrame implements ActionListenerprivate JLabel num1Label,num2Label,resultLabel; private JTextField num1Field,num2Field,resultField; private int num1,num2,result;public DividebyZero() super(除
13、數(shù)運(yùn)算); Container container=getContentPane(); container.setLayout(new GridLayout(3,2); num1Label=new JLabel(被除數(shù)); num1Field=new JTextField(8); container.add(num1Label); container.add(num1Field); num2Label=new JLabel(除數(shù)); num2Field=new JTextField(8); num2Field.addActionListener(this); container.add(num
14、2Label); container.add(num2Field); resultLabel=new JLabel(結(jié)果); resultField=new JTextField(8); container.add(resultLabel); container.add(resultField); pack(); setVisible(true); public void actionPerformed(ActionEvent e)if(e.getSource()=num2Field) try num1=Integer.parseInt(num1Field.getText(); num2=In
15、teger.parseInt(num2Field.getText(); result=divide(num1,num2); resultField.setText(Integer.toString(result); catch(NumberFormatException numberFormatException) JOptionPane.showMessageDialog(this,請(qǐng)輸入整數(shù),數(shù)字格式錯(cuò)誤,JOptionPane.PLAIN_MESSAGE); catch(DivideByZeroException divideByZeroException) JOptionPane.sh
16、owMessageDialog(this,0不可以作為除數(shù), 格式錯(cuò)誤,JOptionPane.WARNING_MESSAGE); public int divide(int num1,int num2) throws DivideByZeroException if(num2=0) throw new DivideByZeroException(數(shù)字錯(cuò)誤); return num1/num2; public static void main(String args) DividebyZero dz=new DividebyZero(); dz.setDefaultCloseOperation
17、( JFrame.EXIT_ON_CLOSE); 2、多異常處理一個(gè)try塊可能會(huì)產(chǎn)生多種不同的異常,如果希望能采取不同的方法來(lái)處理這些例外,就需要使用多異常處理機(jī)制。多異常處理是通過(guò)在一個(gè)try塊后面定義若干個(gè)catch塊來(lái)實(shí)現(xiàn)的,每個(gè)catch塊用來(lái)接收和處理一種特定的異常對(duì)象 通過(guò)catch塊的參數(shù)來(lái)判斷一個(gè)異常對(duì)象是否應(yīng)為本catch塊接收和處理的異常。 被哪個(gè)catch塊獲取,根據(jù)異常對(duì)象與catch塊的異常參數(shù)的匹配情況:當(dāng)它們滿(mǎn)足下面三個(gè)條件的任何一個(gè)時(shí),認(rèn)為異常對(duì)象和參數(shù)匹配:1)異常對(duì)象與參數(shù)屬于相同的例外類(lèi)。2)異常對(duì)象屬于參數(shù)例外類(lèi)的子類(lèi)。3)異常對(duì)象實(shí)現(xiàn)了參數(shù)所定義的接
18、口。如果try塊產(chǎn)生的異常對(duì)象被第一個(gè)catch塊所接收,則程序的流程將直接跳轉(zhuǎn)到這個(gè)catch語(yǔ)句塊中,語(yǔ)句塊執(zhí)行完后就退出當(dāng)前方法,try塊中尚未執(zhí)行的語(yǔ)句和其他的catch塊將被忽略如果try塊產(chǎn)生的異常對(duì)象與第一個(gè)catch塊不匹配,系統(tǒng)將自動(dòng)轉(zhuǎn)到第二個(gè)catch塊進(jìn)行匹配,如果第二個(gè)仍不匹配,就轉(zhuǎn)向第三個(gè)、第四個(gè)直到找到一個(gè)可以接收該異常對(duì)象的catch塊,完成流程的跳轉(zhuǎn)。 如果所有的catch塊都不能與當(dāng)前的異常對(duì)象匹配,程序流程將返回到調(diào)用該方法的上層方法,如果這個(gè)上層方法中定義了與所產(chǎn)生的異常對(duì)象相匹配的catch塊,流程就跳轉(zhuǎn)到這個(gè)catch塊中,否則繼續(xù)回溯更上層的方法;如果所有的方法中都找不到合適的catch塊,則由Java運(yùn)行系統(tǒng)來(lái)處理這個(gè)異常對(duì)象。此時(shí)通常會(huì)中止程序的執(zhí)行,退出虛擬機(jī)返回操作系統(tǒng),并在標(biāo)準(zhǔn)輸出上打印相關(guān)的異常信息。 若try塊中所有語(yǔ)句的執(zhí)行都沒(méi)有引發(fā)異常,則所有的catch塊都會(huì)被忽略而
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- “雙減”背景下項(xiàng)目式教學(xué)在小學(xué)語(yǔ)文習(xí)作教學(xué)中的應(yīng)用策略探究
- 新教材高中政治4.1中國(guó)特色社會(huì)主義進(jìn)入新時(shí)代練習(xí)1含解析部編版必修1
- 備戰(zhàn)2025年高考生物一輪復(fù)習(xí)單元訓(xùn)練金卷第一單元走近細(xì)胞與細(xì)胞的分子組成B卷含解析
- 吉林混凝土加固施工方案
- cfr方式合同范例
- 高考化學(xué)二輪復(fù)習(xí)講練測(cè)專(zhuān)題07 非金屬及其化合物(測(cè))(解析版)
- 個(gè)體挖機(jī)轉(zhuǎn)讓合同范例
- 臨時(shí)維修合同合同范例
- 關(guān)聯(lián)報(bào)價(jià)合同范例
- 音樂(lè)教學(xué)評(píng)價(jià)內(nèi)容
- 心肺復(fù)蘇基本生命支持技術(shù)(雙人)操作考核評(píng)分標(biāo)準(zhǔn)
- 石油工程設(shè)計(jì)大賽油藏工程組獲獎(jiǎng)作品
- 2023年中國(guó)疾病預(yù)防控制中心結(jié)控中心招聘考試真題及答案
- 食堂承包計(jì)劃書(shū)
- 汽車(chē)發(fā)動(dòng)機(jī)構(gòu)造與維修(中職版)全套教學(xué)課件
- 2019版新人教版高中英語(yǔ)必修+選擇性必修共7冊(cè)詞匯表匯總(帶音標(biāo))
- 蘇教版數(shù)學(xué)二年級(jí)下冊(cè)教材分析
- 《字體設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 中醫(yī)婦科病治療
- 2022年高考必背古詩(shī)文60篇默寫(xiě)完成情況自查表-(可編輯)
- 中小學(xué)語(yǔ)文教師教學(xué)培訓(xùn)核心素養(yǎng)下的整本書(shū)閱讀教學(xué)培訓(xùn)課件如何教好孩子閱讀
評(píng)論
0/150
提交評(píng)論