




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、8.1 異常處理概述8.2 異常處理機(jī)制8.3 異常類8.4 綜合實(shí)例8.5 習(xí)題8.1.1 異常處理的概念 異常是指在某些情況下,會(huì)使當(dāng)前正在執(zhí)行的方法或代碼塊無(wú)法繼續(xù)進(jìn)行的問(wèn)題。 異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的。例如,代碼中如果少了一個(gè)分號(hào),那么運(yùn)行出來(lái)結(jié)果是提示是錯(cuò)誤java.lang.Error;而如果代碼為System.out.println(8/0),用0做了除數(shù),那么會(huì)會(huì)拋出java.lang.ArithmeticException的異常?!緦?shí)例8-1】Exception.java public class Exception pu
2、blic static void main(String args) int denominator = 0; if (denominator != 0) int numerator = 8 / denominator; else System.out.println(除數(shù)為零); System.out.println(numerator); 運(yùn)行結(jié)果:程序說(shuō)明: 在這個(gè)實(shí)例中,不考慮異常的作用,因此為了避免除數(shù)為零,最好的做法就是進(jìn)行一次判斷if (denominator != 0),當(dāng)除數(shù)不為零的時(shí)候才進(jìn)入循環(huán)做除法,否則直接打印輸出結(jié)果,這個(gè)時(shí)候被除數(shù)還沒(méi)有聲明,因此程序會(huì)出錯(cuò),拋出ja
3、va.lang.Error的異常。【實(shí)例8-2】Exception.java public class Exception public static void main(String args) int denominator = 0; int numerator = 8 / denominator; System.out.println(numerator); 運(yùn)行結(jié)果:8.1.2 使用異常處理的原因程序執(zhí)行時(shí)經(jīng)常會(huì)出現(xiàn)用戶輸入出錯(cuò)、所需文件找不到、運(yùn)行時(shí)磁盤(pán)空間不夠、內(nèi)存耗盡無(wú)法進(jìn)行類的實(shí)例化、算術(shù)運(yùn)算錯(cuò)、數(shù)組下標(biāo)越界、JVM崩潰等運(yùn)行錯(cuò)誤,影響程序的正常執(zhí)行。錯(cuò)誤及異常是不可避免的,一
4、個(gè)好的應(yīng)用程序,在滿足用戶要求的各種功能的同時(shí),還應(yīng)具備能預(yù)見(jiàn)程序執(zhí)行過(guò)程中可能產(chǎn)生的各種異常的能力,并能為異常情況給予恰當(dāng)處理。Java語(yǔ)言通過(guò)面向?qū)ο蟮漠惓L幚頇C(jī)制來(lái)解決運(yùn)行期間的錯(cuò)誤,可以預(yù)防錯(cuò)誤的程序代碼或系統(tǒng)錯(cuò)誤所造成的不可預(yù)期的結(jié)果發(fā)生。8.1.3 方法的調(diào)用堆棧 Java虛擬機(jī)用方法調(diào)用堆棧來(lái)跟蹤每個(gè)線程中一系列的方法調(diào)用過(guò)程。每個(gè)線程都有一個(gè)獨(dú)立的方法調(diào)用堆棧,堆棧底部的是程序的入口方法main(),放一個(gè)新的方法被調(diào)用時(shí),java虛擬機(jī)就會(huì)把描述該方法的堆棧結(jié)構(gòu)置入棧頂,位于棧頂?shù)姆椒ㄊ钦趫?zhí)行的方法。Java對(duì)異常的處理主要涉及兩方面的內(nèi)容:一是拋出(throw)異常 如果
5、程序在運(yùn)行過(guò)程中出現(xiàn)了運(yùn)行錯(cuò)誤,并且產(chǎn)生的異常與系統(tǒng)中預(yù)定義某個(gè)異常類相對(duì)應(yīng),系統(tǒng)就自動(dòng)產(chǎn)生一個(gè)該異常類的對(duì)象,這個(gè)過(guò)程稱為拋出(throw)異常。二是捕捉(catch)異常 當(dāng)有異常對(duì)象拋出時(shí),將在程序中尋找處理這個(gè)異常的代碼,如果找到處理代碼,則把異常對(duì)象交給該段代碼進(jìn)行處理,這個(gè)過(guò)程稱為捕捉(catch)異常。8.2.1 捕獲異常 我們經(jīng)常會(huì)遇見(jiàn)這樣的情景:程序中出現(xiàn)了異常但是沒(méi)有相應(yīng)的處理措施。這時(shí)候java語(yǔ)言就會(huì)自動(dòng)捕獲并處理異常,一般來(lái)說(shuō)表現(xiàn)為報(bào)告異常字符串,并且在異常發(fā)生出結(jié)束程序的運(yùn)行。但是,為了更好的保證程序正常運(yùn)行,需要人為的捕獲并處理異常。在java語(yǔ)言中該機(jī)制的使用是
6、try-catch-finally結(jié)構(gòu)。try-catch-finally結(jié)構(gòu)的一般格式如下:try 可能拋出異常的語(yǔ)句 catch ( Exception1 e) 異常處理代碼 catch ( Exception2 e) 異常處理代碼 finally 必需執(zhí)行的代碼 如果在程序中有效的設(shè)計(jì)了try-catch-finally結(jié)構(gòu),會(huì)出現(xiàn)兩種情況:能夠捕獲到異常和不能捕獲到異常。如果沒(méi)有捕獲到異常時(shí),程序會(huì)跳過(guò)catch直接到finally(如圖8-3 沒(méi)有捕獲到異常時(shí))如果捕獲到某個(gè)異常,則進(jìn)入相應(yīng)的catch塊內(nèi)(如圖8-4 捕獲到某個(gè)異常時(shí))try 語(yǔ)句 1; 語(yǔ)句 2;catch (
7、Exception1 e) catch ( Exception2 e) finally 語(yǔ)句;try 語(yǔ)句 1; 語(yǔ)句 2;catch ( Exception1 e) catch ( Exception2 e) finally 語(yǔ)句;圖8-3 沒(méi)有捕獲到異常時(shí) 圖8-4 捕獲到某個(gè)異常時(shí)8.2.2 聲明異常 try-catch-finally是在產(chǎn)生異常的方法內(nèi)部處理異常。除此之外,還可以通過(guò)調(diào)用產(chǎn)生異常的方法來(lái)處理這些異常。在方法的聲明中使用throws語(yǔ)句,其一般格式如下: 方法名(參數(shù)) throws 方法體;【實(shí)例8-5】ThrowsException.javapublic class
8、 ThrowsException static void test(int a) throws ArithmeticException,ArrayIndexOutOfBoundsException System.out.println(In Situation + a);if (a = 0) System.out.println(no Exception caught);return; else if (a = 1) int iArray = new int4;iArray10 = 3;public static void main(String args) /try-catch-finall
9、y結(jié)構(gòu)try test(0);test(1); catch (ArrayIndexOutOfBoundsException e) System.out.println(Catch + e); finally System.out.println(in Proc finally);運(yùn)行結(jié)果:In Situation0no Exception caughtIn Situation1Catch java.lang.ArrayIndexOutOfBoundsException: 10in Proc finally8.2.3 拋出異常 日常生活中,例如學(xué)校中有什么問(wèn)題都會(huì)先去問(wèn)老師,但是有一些問(wèn)題例如轉(zhuǎn)
10、學(xué)是不能由老師來(lái)解決的,這時(shí)候老師就需要再去問(wèn)校長(zhǎng),由校長(zhǎng)來(lái)解決這個(gè)問(wèn)題。可能校長(zhǎng)還有不能解決的問(wèn)題,就需要去問(wèn)教育部。拋出異常也是這樣的,當(dāng)一個(gè)程序段發(fā)生異常時(shí),如果自己不能夠進(jìn)行異常處理,就可以將拋出異常給上一層。如果上一層也不能解決就可以一直向上拋出異常,直到拋出給main方法。如果仍然不能解決,就會(huì)中斷程序,將異常顯示出來(lái)。 在java語(yǔ)言中,所有方法都是通過(guò)throw語(yǔ)句來(lái)拋出一個(gè)異常事件,拋出異常首先需要通過(guò)throw語(yǔ)句生成一個(gè)異常類的對(duì)象,其一般格式如下: throw new 異常類名; 注意:異常類名必須是Exception或其直接或間接子類。利用throw語(yǔ)句,可以自定義異
11、常,并顯示自定義的異常信息?!緦?shí)例8-6】ThrowException.javaclass ThrowException public static void main(String args) try throwTest(); catch (NullPointerException e) System.out.println(Recaught: + e);static void throwTest() try throw new NullPointerException(test); catch (NullPointerException e) System.out.println(Caug
12、ht inside throwTest.);throw e;運(yùn)行結(jié)果:Caught inside throwTest.Recaught:java.lang.NullPointerException: test8.2.4 自定義異常盡管java內(nèi)建的異常處理機(jī)制提供了豐富的異常類型,能夠滿足程序員的大部分需求,但有時(shí)候也需要程序員在程序中自定義異常類,根據(jù)自己的意愿來(lái)處理異常。自定義異常的一般格式為:class 異常類名 extends Exception 方法體;8.3.1 java中異常類的結(jié)構(gòu) 在java語(yǔ)言中,異常有兩種分類:1)java.lang.Throwable類為所有對(duì)象的父類,
13、可以使用異常處理機(jī)制將這些對(duì)象拋出并捕獲。2)在Throwable類中定義方法來(lái)檢索與異常相關(guān)的錯(cuò)誤信息,并打印顯示異常發(fā)生的棧跟蹤信息。它有Error和Exception兩個(gè)基本子類:錯(cuò)誤(Error):JVM系統(tǒng)內(nèi)部錯(cuò)誤、資源耗盡等嚴(yán)重情況;異常(Exception):其它因編程錯(cuò)誤或偶然的外在因素導(dǎo)致的一般性問(wèn)題。Throwable類Error類Exception類 RuntimeException類ArithmeticException類IndexOutofBoundException類ArrayIndexOutofBoundsException類IoException類FileNot
14、FoundException類EOFException類在Java.lang包在Java.io包圖8-5 java中異常類的結(jié)構(gòu)8.3.2 運(yùn)行時(shí)異常運(yùn)行時(shí)異常(RuntimeException)是指因設(shè)計(jì)或?qū)崿F(xiàn)方式不當(dāng)導(dǎo)致的問(wèn)題。也可以說(shuō)是程序員的原因?qū)е碌膯?wèn)題,本來(lái)可以避免發(fā)生的情況。這種異常的特點(diǎn)是java編譯器不會(huì)檢查它。由于沒(méi)有處理它,因此,當(dāng)出現(xiàn)這類異常時(shí),異常對(duì)象一直被傳遞到main()方法,程序?qū)惓=K止。如果采用了異常處理,異常將會(huì)被相應(yīng)的程序執(zhí)行處理。表8-1給出了java語(yǔ)言預(yù)定義的Error異常子類,下面是運(yùn)行時(shí)異常的常見(jiàn)子類,如表8-2 運(yùn)行時(shí)異常子類:異常類名異常類
15、名描述描述ArithmeticException算數(shù)錯(cuò)誤NullPointerException非法使用空引用ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越界ClassCastException非法強(qiáng)制轉(zhuǎn)換類型NegativeArraySizeException創(chuàng)建帶負(fù)維數(shù)大小的數(shù)組的嘗試ArrayStoreException數(shù)組元素賦值類型不兼容IndexOutOfBoundException某些類型索引越界NumberFormatException字符串到數(shù)字格式非法轉(zhuǎn)換SecurityException試圖違反安全性StringIndexOutOfBounds試圖
16、在字符串邊界之外索引UnsupportedOperationException遇到不支持的操作IllegalArgumentException調(diào)用方法的參數(shù)非法IllegalMonitorStateException非法監(jiān)控操作IllegalStateException環(huán)境或應(yīng)用狀態(tài)不正確IllegalThreadStateException請(qǐng)求操作與當(dāng)前線程狀態(tài)不兼容表8-2 運(yùn)行時(shí)異常子類8.3.3 受檢查異常 Exception類中除了RuntimeException子類以外的類都是受檢查異常類。如表8-3 受檢查異常子類:異常類名異常類名描述描述ClassNotFoundExcepti
17、on找不到類CloneNotSupportedException試圖復(fù)制一個(gè)不能實(shí)現(xiàn)的Cloneable接口對(duì)象NoSuchMethodException請(qǐng)求的字段不存在NoSuchMethodException請(qǐng)求的方法不存在InterruptedException一個(gè)線程被另一個(gè)線程中斷IllAccessException對(duì)一個(gè)類的訪問(wèn)被拒絕InstantiationException試圖創(chuàng)建一個(gè)抽象類或者抽象接口的對(duì)象【實(shí)例8-9】ExceptionTest.javaclass ExceptionCom extends Exception private static final lon
18、g serialVersionUID = 1L;ExceptionCom() super(自定義異常);public class ExceptionTest public void A1(int n) System.out.println(A1前面);A2(n);System.out.println(A1后面);public void A2(int n) System.out.println(A2前面);try System.out.println(try的前面);A3(n);/ 發(fā)生異常時(shí)不會(huì)輸出System.out.println(try的后面); catch (ExceptionCom e) System.err.println(e.getMessage(); finally System.out.println(無(wú)論是否發(fā)生異常);System.out.println(A2后面);publi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工資核算薪酬管理制度
- 關(guān)于電梯安全管理制度
- 其他安全保衛(wèi)管理制度
- 醫(yī)用耗材采購(gòu)管理制度
- 行政組織理論中員工參與的作用試題及答案
- 創(chuàng)意店鋪物料管理制度
- 學(xué)校安全物資管理制度
- 公司薪酬分級(jí)管理制度
- 醫(yī)院病房床單管理制度
- 關(guān)于員工打架管理制度
- 金融學(xué)課件:貨幣供給
- 中資商業(yè)銀行行政許可事項(xiàng)申請(qǐng)材料目錄及格式要求
- MOOC 營(yíng)銷管理-電子科技大學(xué) 中國(guó)大學(xué)慕課答案
- 《城市綜合管廊技術(shù)狀況評(píng)定標(biāo)準(zhǔn)》
- 2024年黔東南州能源投資有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2024年度-白內(nèi)障課件PPT
- 學(xué)費(fèi)收款收據(jù)模版
- 中國(guó)急性胰腺炎診治指南解讀張志強(qiáng)
- 網(wǎng)絡(luò)意識(shí)形態(tài)存在的風(fēng)險(xiǎn)點(diǎn)及措施
- 腹腔引流管健康宣教Ppt
- 設(shè)備交接資料清單
評(píng)論
0/150
提交評(píng)論