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

下載本文檔

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

文檔簡介

第7章Java異常處理

7.1異常處理概述7.2Java異常的處理方法

本章要點(diǎn)了解異常和異常分類理解Java異常處理機(jī)制和異常類。掌握try/catch/finally語句處理異常的方式以及如何聲明異常。了解自定義異常。7.1異常處理概述

Java異常是描述在代碼段中發(fā)生的運(yùn)行出錯情況的對象。程序中的錯誤可能來自于編譯錯誤和運(yùn)行錯誤。編譯錯誤是由于所編寫的程序存在語法問題,未能通過由源代碼到目標(biāo)代碼的編譯過程而產(chǎn)生的錯誤,它將由語言的編譯系統(tǒng)負(fù)責(zé)檢測和報(bào)告;運(yùn)行錯誤是在程序的運(yùn)行過程中產(chǎn)生的錯誤。7.1.1什么是異常 在程序執(zhí)行中,任何中斷正常程序流程的異常條件就是錯誤或異常。 第一種,Java虛擬機(jī)檢測到了非正常的執(zhí)行狀態(tài),這些狀態(tài)可能是由以下幾種情況引起的: ①表達(dá)式的計(jì)算違反了Java語言的語義,例如整數(shù)被0除。 ②在載入或鏈接Java程序時出錯。 ③超出了某些資源限制,例如使用了太多的內(nèi)存。 第二種,Java程序代碼中的throw語句被執(zhí)行。 第三種,異步異常發(fā)生。異步異常的原因可能有: ①Thread的stop方法被調(diào)用。 ②Java虛擬機(jī)內(nèi)部錯誤發(fā)生。7.1.2異常處理機(jī)制

Java異常處理是通過5個關(guān)鍵字來管理的。它們是try、catch、throw、throws和finally。

程序里,需要被監(jiān)測的程序語句序列應(yīng)包含在一個try代碼塊中。如果try代碼塊中有異常發(fā)生,那么就要拋出該異常??梢杂胏atch來捕獲這個異常,并且在catch塊中加以適當(dāng)?shù)靥幚?。系統(tǒng)產(chǎn)生的異常會由Java運(yùn)行時系統(tǒng)自動拋出。如果要手動拋出異常,則使用關(guān)鍵字throw。在一些情況下,從一個方法拋出的異常必須用一個throws語句指定為異常。最后,從try代碼塊退出時,必須執(zhí)行的代碼要放在一個finally代碼塊中。7.1.3異常分類

Java中的異常類具有層次組織,其中Throwable類是Error類(錯誤類)和Exception類(異常類)的父類,Throwable是Object的直接子類。 異常類(java.lang.Exception)繼承于java.lang.Object中的java.lang.Throwable類。異常可分為執(zhí)行異常(RuntimeException)和檢查異常(CheckedExceptions)兩種。異常類的繼承結(jié)構(gòu)ThrowableErrorExceptionObjectAWTExceptionRuntimeExceptionIOException……

1.執(zhí)行異常即運(yùn)行時異常,繼承于RuntimeException。Java編譯器允許程序不做處理。ArithmeticException:一個不尋常算術(shù)運(yùn)算產(chǎn)生的異常。ArrayStoreException:存入數(shù)組的內(nèi)容數(shù)據(jù)類型不一致所產(chǎn)生的異常。ArrayIndexOutOfBoundsException:數(shù)組索引超出范圍所產(chǎn)生的異常。ClassCastExcption:類對象強(qiáng)迫轉(zhuǎn)換造成不當(dāng)類對象所產(chǎn)生的異常。NumberFormatException:字符串轉(zhuǎn)換數(shù)值所產(chǎn)生的異常。IndexOutOfBoundsException:索引超出范圍所產(chǎn)生的異常。NegativeException:數(shù)組建立負(fù)值索引所產(chǎn)生的異常。NullPointerException:對象引用參考值為null所產(chǎn)生的異常。

2.檢查異常 除了執(zhí)行異常外,其余的子類是屬于檢查 異常類也稱為非運(yùn)行時異常,它們都在

java.lang類庫內(nèi)定義。Java編譯器要求程序必須捕獲或者聲明拋棄這種異常。

ClassNotFoundException:找不到類或接口所產(chǎn)生的異常。

CloneNotSupportedException:使用對象的clone方法但無法執(zhí)行Cloneable所產(chǎn)生的異常。

IllegaAccessException:類定義不明確所產(chǎn)生的異常。

InstantiationException:使用newInstance方法試圖建立一個類instance時所產(chǎn)生的異常。

InterruptedException:目前線程等待執(zhí)行,另一線程中斷目前線程所產(chǎn)生的異常。

7.1.4錯誤分類

Error類與異常一樣,它們都是繼承自java.lang.Throwable類。Error類對象由Java虛擬機(jī)生成并拋出。Error類包括linkageError(結(jié)合錯誤)與VitualmachineError(虛擬機(jī)錯誤)兩種子類。1.linkageErrorLinkageError的子類表示一個類依賴于另一個類,但是,在前一個類編譯之后,后一個類的改變會與它不兼容。ClassFormarErro:類格式所產(chǎn)生的錯誤。ClassCircularityError:無限循所產(chǎn)生的錯誤。ExceptionInInitializerError:初始化所產(chǎn)生的錯誤。NoClassDeFormatError:沒有類定義所產(chǎn)生的錯誤。VeritfyError:類文件某些數(shù)據(jù)不一致或安全問題所產(chǎn)生的錯誤。UnsatisfidLinkError:Java虛擬機(jī)無法找到合適的原始語言(native-language)定義的方法所產(chǎn)生的錯誤。IncompatibleClassChangeError:不兼容類所產(chǎn)生的錯誤。AbtractMethodError:調(diào)用抽象方法所產(chǎn)生的錯誤。NoSuchFieldError:存取或改變數(shù)據(jù)域所產(chǎn)生的錯誤。NoSchMethodError:調(diào)用類方法所產(chǎn)生的錯誤。IllegalAccessError:不合法存取或改變數(shù)據(jù)域或調(diào)用方法所產(chǎn)生的錯誤。InstantionError:使用抽象類或接口所產(chǎn)生的錯誤。 2.VitualmachineError

當(dāng)Java虛擬機(jī)崩潰了或用盡了它繼續(xù)操作所需的資源時,拋出該錯誤。

VitualmachineError包含InternalError,OutOfMemoryError,StackOverflow-Error,UnknownError。這些類所代表的意義:

InternalError:虛擬機(jī)內(nèi)部所產(chǎn)生的錯誤。

OutOfMemoryError:虛擬機(jī)內(nèi)存不足所產(chǎn)生的錯誤。

StackOverflowError:堆棧無法容納所產(chǎn)生的錯誤。

UnknownError:虛擬機(jī)不知名異常所產(chǎn)生的錯誤。7.2Java異常的處理方法 當(dāng)發(fā)生Exception時,那么,在編寫程序時可以采取的措施: ①通過將try{}catch(){}塊納入其代碼中,在這里捕獲被命名為屬于某個超類的異常,并調(diào)用方法處理它。 ②讓被調(diào)用的方法表示它將不處理異常,將該異常拋到它所遇到的調(diào)用方法中。這用throws子句實(shí)現(xiàn)。 使用throws子句標(biāo)記調(diào)用方法的聲明如下所示:

publicvoidtroublesome()throwsException

其中,關(guān)鍵字throws之后是所有異常的列表,方法可以將它們拋回到它的調(diào)用程序中。1.try/catchtry/catch異常處理代碼塊的基本形式:

try

//監(jiān)視{可能發(fā)生異常的代碼塊;}

catch(異常類型異常對象名)//捕獲并處理異常{異常處理代碼塊;} 當(dāng)拋出一個異常時,異常會由相應(yīng)的catch語句捕獲并處理。與一個try相關(guān)的catch語句可以有多個,構(gòu)成多重catch語句,異常類型決定了要執(zhí)行哪個catch語句。 如果沒有拋出異常,那么try代碼塊就會結(jié)束,并且會跳過它的所有catch語句,從最后一個catch后面的第一個語句繼續(xù)執(zhí)行。

7.2.1try/catch/finally

例7.2使用try/catch進(jìn)行異常處理的情況。publicclassExceptionExam0{

publicstaticvoidmain(Stringargs[]){

inti,a;

try{//監(jiān)視一代碼塊

i=0;

a=42/i;return;

}catch(ArithmeticExceptione){//捕獲一個被零除異常System.out.println("被零除");}

}}例7.2成運(yùn)行結(jié)果如圖所示

2.可嵌入的try塊 一個try代碼塊可以嵌入到另一個try代碼塊當(dāng)中。由于內(nèi)部try代碼塊產(chǎn)生的異常如果沒有被與該內(nèi)部try代碼塊相關(guān)的catch捕獲,就會傳到外部try代碼塊。 通常嵌入式try代碼塊用于以不同方式處理不同類型的錯誤。某些類型的錯誤是致命的,無法修改。某些錯誤則較輕,可以馬上處理。許多程序員在使用外部try代碼塊捕獲大部分嚴(yán)重錯誤的同時,讓內(nèi)部try代碼處理不太嚴(yán)重的錯誤。

例7.3嵌套try語句的示例。publicclassExceptionExam2{publicstaticvoidmain(Stringargs[]){intdata1[]={2,4,6,8,10,12};intdata2[]={1,0,2,4,3};try{for(inti=0;i<data1.length;i++){try{System.out.println(data1[i]+"/"+data2[i]+"is"+data1[i]/data2[i]);}catch(ArithmeticExceptione){System.out.println("不能被零除!");}}}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("程序被終止!");}}}例7.3成運(yùn)行結(jié)果如圖所示

3.使用多重catch語句 與一個try相關(guān)的catch語句可以有多個。每一個catch語句捕獲一個不同類型的異常。某些情況,由單個代碼段可能引起多個異常。處理這種情況時就需要定義兩個或更多的catch子句,每個子句捕獲一種類型的異常。當(dāng)異常被引發(fā)時,每一個catch子句被依次檢查,第一個匹配異常類型的子句被執(zhí)行。當(dāng)一個catch語句執(zhí)行以后,其他的子句被忽略,程序從try/catch塊后的代碼開始繼續(xù)執(zhí)行。例7.4捕獲兩種不同類型的異常。publicclassExceptionExam3{

publicstaticvoidmain(Stringargs[]){try{inti=args.length;System.out.println("i="+i);intj=5/i;intk[]={1,2,3};k[5]=0;}catch(ArithmeticExceptione){System.out.println("被零除:"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Arrayindexoutofboundexception:"+e);}System.out.println("執(zhí)行catch塊后的語句塊");}}例7.4成運(yùn)行結(jié)果如圖所示 4.finally關(guān)鍵字的使用

try/catch/finally的基本形式如下所示:

try

{

可能發(fā)生異常的代碼塊; }

catch(異常類型異常對象名) { 異常處理代碼塊; } …

finally {

無論是否拋出異常都要執(zhí)行的代碼; } 無論是出于何種原因,只要執(zhí)行離開try/catch代碼塊,就會執(zhí)行finally代碼塊。即無論try是否正常結(jié)束,都會執(zhí)行finally定義的最后的代碼。例7.5使用finally的示例。publicclassExceptionExam4{ publicstaticvoidmain(String[]args) { try { int[]a=newint[3]; a[2]=4;return; }catch(ArithmeticExceptione){ System.out.println("發(fā)生了異常");}finally{ System.out.println("最后執(zhí)行的語句!");}}}例7.5成運(yùn)行結(jié)果如圖所示7.2.2聲明異常(throws)聲明拋棄異常是在一個方法聲明中的throws子句中指明的。下面是包含throws子句的方法的基本形式:[修飾符]返回類型方法名(參數(shù)1,參數(shù)2,……)throws異常列表{……}例如:publicintread()throwsIOException{……}throws子句中同時可以指明多個異常,說明該方法將不對這些異常進(jìn)行處理,而是聲明拋棄它們。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException

{……}

7.2.3拋出異常(throw)

手動拋棄異常對象是通過throw語句實(shí)現(xiàn)的,但可以拋棄的異常必須是Throwable或其子類的實(shí)例。其基本形式如下:

throw異常名;

throw關(guān)鍵字主要是用在try塊中,用來說明已經(jīng)發(fā)生的異常情況。throw關(guān)鍵字后面跟隨一個從類Throwable中派生的異常對象,用來說明發(fā)出的異常類型。throw語句促使程序立即停止運(yùn)行,并且重復(fù)執(zhí)行最近能夠處理指定對象的catch語句。如果異常在程序的其他地方產(chǎn)生,throw語句也可以放在try語句的后面。為了把異常處理控制傳遞給更高層的處理模塊,還可以對截獲的異常對象再一次實(shí)施throw操作。例7.7使用throw關(guān)鍵字手動拋出IOException異常。importjava.io.*;publicclassExceptionExam6{publicstaticvoidmain(String[]args){try{System.out.println("…正在運(yùn)行程序…");thrownewIOException("用戶自行產(chǎn)生異常");}catch(IOExceptione){System.out.println("已捕獲了該異常!");}}}例7.7成

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論