第7章 Java異常處理_第1頁(yè)
第7章 Java異常處理_第2頁(yè)
第7章 Java異常處理_第3頁(yè)
第7章 Java異常處理_第4頁(yè)
第7章 Java異常處理_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

第7章Java異常處理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7.1.4錯(cuò)誤分類

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

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

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

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

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

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

UnknownError:虛擬機(jī)不知名異常所產(chǎn)生的錯(cuò)誤。7.2Java異常的處理方法 當(dāng)發(fā)生Exception時(shí),那么,在編寫程序時(shí)可以采取的措施: ①通過(guò)將try{}catch(){}塊納入其代碼中,在這里捕獲被命名為屬于某個(gè)超類的異常,并調(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(異常類型異常對(duì)象名)//捕獲并處理異常{異常處理代碼塊;} 當(dāng)拋出一個(gè)異常時(shí),異常會(huì)由相應(yīng)的catch語(yǔ)句捕獲并處理。與一個(gè)try相關(guān)的catch語(yǔ)句可以有多個(gè),構(gòu)成多重catch語(yǔ)句,異常類型決定了要執(zhí)行哪個(gè)catch語(yǔ)句。 如果沒(méi)有拋出異常,那么try代碼塊就會(huì)結(jié)束,并且會(huì)跳過(guò)它的所有catch語(yǔ)句,從最后一個(gè)catch后面的第一個(gè)語(yǔ)句繼續(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){//捕獲一個(gè)被零除異常System.out.println("被零除");}

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

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

例7.3嵌套try語(yǔ)句的示例。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語(yǔ)句 與一個(gè)try相關(guān)的catch語(yǔ)句可以有多個(gè)。每一個(gè)catch語(yǔ)句捕獲一個(gè)不同類型的異常。某些情況,由單個(gè)代碼段可能引起多個(gè)異常。處理這種情況時(shí)就需要定義兩個(gè)或更多的catch子句,每個(gè)子句捕獲一種類型的異常。當(dāng)異常被引發(fā)時(shí),每一個(gè)catch子句被依次檢查,第一個(gè)匹配異常類型的子句被執(zhí)行。當(dāng)一個(gè)catch語(yǔ)句執(zhí)行以后,其他的子句被忽略,程序從try/catch塊后的代碼開(kāi)始繼續(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塊后的語(yǔ)句塊");}}例7.4成運(yùn)行結(jié)果如圖所示 4.finally關(guān)鍵字的使用

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

try

{

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

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

finally {

無(wú)論是否拋出異常都要執(zhí)行的代碼; } 無(wú)論是出于何種原因,只要執(zhí)行離開(kāi)try/catch代碼塊,就會(huì)執(zhí)行finally代碼塊。即無(wú)論try是否正常結(jié)束,都會(huì)執(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í)行的語(yǔ)句!");}}}例7.5成運(yùn)行結(jié)果如圖所示7.2.2聲明異常(throws)聲明拋棄異常是在一個(gè)方法聲明中的throws子句中指明的。下面是包含throws子句的方法的基本形式:[修飾符]返回類型方法名(參數(shù)1,參數(shù)2,……)throws異常列表{……}例如:publicintread()throwsIOException{……}throws子句中同時(shí)可以指明多個(gè)異常,說(shuō)明該方法將不對(duì)這些異常進(jìn)行處理,而是聲明拋棄它們。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException

{……}

7.2.3拋出異常(throw)

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

throw異常名;

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

溫馨提示

  • 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)論