版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章異常和調(diào)試知識(shí)點(diǎn)掌握異常、拋出、捕獲的概念會(huì)使用try和catch進(jìn)行異常處理掌握根本的調(diào)試技巧Java把程序運(yùn)行時(shí)的可能遇到的錯(cuò)誤分為兩類:一類是非致命的,通過(guò)某種修正后程序還能繼續(xù)執(zhí)行。這類錯(cuò)誤叫作異常。如:文件不存在、無(wú)效的下標(biāo)、空引用、網(wǎng)絡(luò)斷開(kāi)、打印機(jī)脫機(jī)、磁盤滿了等。Java中提供了一種獨(dú)特的處理異常的機(jī)制,通過(guò)異常來(lái)處理程序設(shè)計(jì)中出現(xiàn)的錯(cuò)誤。另一類是致命的,即程序遇到了非常嚴(yán)重的不正常狀態(tài),不能簡(jiǎn)單恢復(fù)執(zhí)行,這就是致命性錯(cuò)誤。如:內(nèi)存耗盡、系統(tǒng)內(nèi)部錯(cuò)誤等。這種錯(cuò)誤只能在編程階段解決,運(yùn)行時(shí)程序本身無(wú)法解決。異常處理的任務(wù)就是把控制從錯(cuò)誤產(chǎn)生的地方轉(zhuǎn)移到能夠進(jìn)行錯(cuò)誤處理的地方。8.1異常分類Java虛擬機(jī)檢測(cè)到非正常的執(zhí)行狀態(tài):〔1〕表達(dá)式的計(jì)算違反了Java語(yǔ)言的語(yǔ)義;〔2〕在載入或鏈接Java程序時(shí)出錯(cuò);〔3〕超出了某些資源限制。這些異常都是無(wú)法預(yù)知的。Java程序代碼中的throw語(yǔ)句被執(zhí)行。異步異常發(fā)生。主要原因:〔1〕Thread的stop方法被調(diào)用;〔2〕Java虛擬內(nèi)部錯(cuò)誤發(fā)生。1.異常發(fā)生的原因在Java中,每個(gè)包中都定義了異常類,而所有的異常類都直接或間接地繼承于Throwable類。Java中的異常類可分為兩大類:
Error
Error分支用于Java運(yùn)行時(shí)系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡。
Exception
Exception分支是要重點(diǎn)掌握的異常類。2.異常類的層次2.異常類的層次RuntimeException運(yùn)行時(shí)異常類ArithmeticException算術(shù)異常類ArrayStoreException數(shù)組存儲(chǔ)異常類ClassCastException類型強(qiáng)制轉(zhuǎn)換異常類IndexOutOfBoundsException下標(biāo)越界異常類NullPointerException空指針異常類SecurityException違背平安原那么異常類2.異常類的層次Exception的其它子類EmptyStackExceptionNoSuchFieldExceptionNoSuchMethodExceptionClassNotFoundExceptionCloneNotSupportedExceptionIllegalAccessExceptionInstantiationExceptionInterruptedException2.異常類的層次Java輸入輸出的異常類IOException:申請(qǐng)I/O操作沒(méi)有正常完成。EOFException:在輸入操作正常結(jié)束前遇見(jiàn)了文件結(jié)束符。FileNotFountException:在文件系統(tǒng)中,沒(méi)有找到由文件名字符串指定的文件。2.異常類的層次當(dāng)Java應(yīng)用程序出現(xiàn)錯(cuò)誤時(shí),會(huì)產(chǎn)生一個(gè)異常對(duì)象,這個(gè)對(duì)象包含了異常的類型和錯(cuò)誤出現(xiàn)時(shí)程序所處的狀態(tài)信息。把異常對(duì)象遞交給Java編譯器的過(guò)程稱為拋出。一個(gè)方法不僅能告訴Java編譯器它能返回什么值,還可以告訴Java編譯器有可能產(chǎn)生什么樣的錯(cuò)。例:
publicStringreadline()throwIOException8.2拋出異常首先決定拋出異常類型。例如:當(dāng)從一個(gè)長(zhǎng)為1024的文件中讀取數(shù)據(jù)時(shí),但讀到688時(shí)遇到了文件結(jié)束標(biāo)記,此時(shí)應(yīng)拋出一個(gè)異常,EOFException比較適宜。代碼為:thrownewEOFException();或:EOFExceptione=newEOFException();throwe;一個(gè)方法拋出了異常后,那么它再也不能返回調(diào)用者了。1.如何拋出異常從Exception或IOException派生一個(gè)子類即可。ClassFileExceptionextendsIOException{publicFileException(){}publicFileException(Stringgripe){}}2.創(chuàng)立異常類StringReadData(in)throwFileExcetion{…while(…){if(ch==-1){if(n<len)thrownewFileException();}…}…}3.在程序中拋出異常異常發(fā)生時(shí),Java運(yùn)行系統(tǒng)從生成的代碼塊開(kāi)始,尋找相應(yīng)的處理代碼,并將異常交給該方法處理,這一過(guò)程叫作捕獲。假設(shè)要捕獲一個(gè)異常,需要設(shè)置一個(gè)try/catch/finally塊:try語(yǔ)句括住可能拋出異常的代碼段。catch指明要捕獲的異常及相應(yīng)的處理代碼。finally指明必須執(zhí)行的程序塊。代碼如下:try{…}catch(Exceptione){…}finally{…}8.3捕獲異常捕獲異常的第一步是用try{…}選定捕獲異常的范圍,由try所限定的代碼塊中的語(yǔ)句在執(zhí)行過(guò)程中可能會(huì)生成異常對(duì)象并拋出。
1.try子句每個(gè)try代碼塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于處理try代碼塊中所生成的異常事件。catch語(yǔ)句只需要一個(gè)形式參數(shù)指明它所能夠捕獲的異常類型,這個(gè)類必須是Throwable的子類,運(yùn)行時(shí)系統(tǒng)通過(guò)參數(shù)值把被拋出的異常對(duì)象傳遞給catch塊。在catch塊中是對(duì)異常對(duì)象進(jìn)行處理的代碼,與訪問(wèn)其它對(duì)象一樣,可以訪問(wèn)一個(gè)異常對(duì)象的變量或調(diào)用它的方法。getMessage()是類Throwable所提供的方法,用來(lái)得到有關(guān)異常事件的信息,類Throwable還提供了方法printStackTrace()用來(lái)跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。2.catch子句一個(gè)捕獲異常的例子publicvoidread(reader){try{booleandone=false;while(!done){Stringlin=reader.readLine();if(line==null)done=true;else{……}}}
catch(IOException
e){……}}
2.catch子句對(duì)于異常有處理,可以捕獲,也可以只拋出不作任何處理,上例可改為:publicvoidread(reader)throwsIOException{booleandone=false;while(!done){Stringlin=reader.readLine();if(line==null)done=true;else{……}}}2.catch子句一般來(lái)說(shuō):確切知道如何處理的異常應(yīng)該捕獲,而把那些不知道如何去處理的異常只做拋出,將它傳遞給調(diào)用者去處理??梢栽谝粋€(gè)try塊中捕獲多個(gè)異常類型,每個(gè)異常類型需要個(gè)單獨(dú)的catch子句。
try{拋出異常代碼}
catch(ExceptionType1e){
拋出exceptionType1時(shí)要執(zhí)行的代碼}
catch(ExceptionType2e){
拋出exceptionType2時(shí)要執(zhí)行的代碼}
catch(ExceptionType3e){
拋出exceptionType3時(shí)要執(zhí)行的代碼}2.catch子句catch語(yǔ)句的順序:
捕獲異常的順序和catch語(yǔ)句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的catch語(yǔ)句就不再進(jìn)行匹配。因此,在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。2.catch子句例1在方法中立即處理本方法拋出的異常classMyExceptionextendsException{
MyException(){super();}
MyException(Strings){super(s);}}2.catch子句classTryAndCatch{ staticvoiddemoThrow(Strings){try{
if(s.equals("welcome")){System.out.println("demoThrow(\""+s+"\")未拋出異常");}
if(s.equals("bug")){ thrownewMyException("abug");} }catch(MyExceptione){
System.err.println("demoThrow(\""+s+"\")拋出類型為\""+e.getClass()+"\",異常信息是\""+e.getMessage()+"\"的異常"); }}2.catch子句
publicstaticvoidmain(String[]args){
for(inti=0;i<args.length;i++){
demoThrow(args[i]);
("*****");}
("程序結(jié)束");}}2.catch子句以參數(shù)welcomebug執(zhí)行該程序,產(chǎn)生的輸出為:demoThrow(“welcome”)未拋出異常*****demoThrow(“bug”)拋出類型為“classMyException”,異常信息是”abug”的異常*****程序結(jié)束
在demoThrow方法中可直接處理所產(chǎn)生的檢查型異常MyException,在main方法中就可不處理異常。2.catch子句例2處理運(yùn)行時(shí)異常classHandleRTE{ publicstaticvoidmain(String[]args){
int[]a={2,4}; try{ m1(a); }catch(Exceptione){
("*****"+e);
e.printStackTrace(); }
("執(zhí)行了m1(a)之后的語(yǔ)句"); }staticvoidm1(int[]b)throwsException{m2(b);}staticvoidm2(int[]c)throwsException{System.out.println(c[2]);}}2.catch子句程序產(chǎn)生了6行輸出:
*****::atHandleRTE.m2(HandleRTE.java:14)atHandleRTE.m1(HandleRTE.java:12)atHandleRTE.main(HandleRTE.java:5)執(zhí)行了m1(a)之后的語(yǔ)句
2.catch子句盡管Java對(duì)運(yùn)行時(shí)異常不進(jìn)行檢查,用戶可不處理運(yùn)行時(shí)異常,但是處理與不處理運(yùn)行時(shí)異常,程序的執(zhí)行效果是不同的。在程序中假設(shè)沒(méi)有處理異常,當(dāng)執(zhí)行語(yǔ)句m1(a)時(shí)出現(xiàn)異常,Java在進(jìn)行異常處理后便終止程序了。如果監(jiān)視了語(yǔ)句m1(a)并處理了出現(xiàn)的異常,m1(a)后的語(yǔ)句將會(huì)執(zhí)行。catch塊中的第1個(gè)語(yǔ)句〔("*****"+e);〕輸出了第1行,第2個(gè)語(yǔ)句〔e.printStackTrace();〕輸出了第2~5行,位于catch子句后的輸出語(yǔ)句〔("執(zhí)行了m1(a)之后的語(yǔ)句");〕輸出了第6行。2.catch子句捕獲異常的最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它局部以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不管在try代碼塊中是否發(fā)生了異常事件,finally塊中的語(yǔ)句都會(huì)被執(zhí)行。3.finally子句例3
finally子句的使用classUseFinally{ publicstaticvoidmain(String[]args){
int[]a={2,4}; try{ m1(a); }finally{
("執(zhí)行了m1(a)之后的語(yǔ)句"); } }staticvoidm1(int[]b)throws
ArrayIndexOutOfBoundsException{m2(b);}staticvoidm2(int[]c)throws
ArrayIndexOutOfBoundsException
{System.out.println(c[2]);}}
3.finally子句Java通過(guò)try—finally語(yǔ)句提供了這樣的機(jī)制:不處理運(yùn)行時(shí)異常,當(dāng)運(yùn)行時(shí)異常出現(xiàn)后又能繼續(xù)執(zhí)行必須執(zhí)行的程序塊。一般形式是:
try{//括號(hào)內(nèi)為被監(jiān)視的塊
…}
finally{//無(wú)論上面被監(jiān)視的塊是否出現(xiàn)異常,本括號(hào)內(nèi)的塊都執(zhí)行
…}3.finally子句例4finally配合break,continue和return語(yǔ)句工作classFinalBCR{ publicstaticvoiduseFBCR(){
for(char
ch='a';ch<'d';ch++){ try{
if(ch=='("收到字符a");}
if(ch=='("收到字符b");continue;}
if(ch=='("收到字符c");break;} }finally{System.out.println(ch+""+ch+""+ch);}
("收到字符a才執(zhí)行該語(yǔ)句"); } } publicstaticvoidmain(String[]args){
useFBCR();
("程序結(jié)束"); }}3.finally子句程序產(chǎn)生的輸出是:收到字符aaaa收到字符a才執(zhí)行該語(yǔ)句
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職畜牧獸醫(yī)(畜牧獸醫(yī)技能考核)試題及答案
- 2025年高職會(huì)計(jì)檔案管理(檔案實(shí)務(wù))試題及答案
- 2025年中職機(jī)械設(shè)計(jì)與制造(機(jī)械制圖基礎(chǔ))試題及答案
- 2025年大學(xué)第四學(xué)年(臨床醫(yī)學(xué))兒童康復(fù)評(píng)估試題及答案
- 2025年中職裝配化裝修技術(shù)(構(gòu)件安裝基礎(chǔ))試題及答案
- 2025年大學(xué)(自動(dòng)化)檢測(cè)技術(shù)與儀表基礎(chǔ)綜合測(cè)試卷及評(píng)分標(biāo)準(zhǔn)
- 2025年中職工程造價(jià)(工程計(jì)價(jià)規(guī)范應(yīng)用)試題及答案
- 2025年大學(xué)漢語(yǔ)言文學(xué)(文學(xué)理論研究)試題及答案
- 2025年高職林木種苗生產(chǎn)技術(shù)(林木種苗管理)試題及答案
- 2025年大學(xué)資源勘查工程技術(shù)(礦產(chǎn)勘查方法)試題及答案
- T-CFLP 0016-2023《國(guó)有企業(yè)采購(gòu)操作規(guī)范》【2023修訂版】
- 新風(fēng)機(jī)組施工方案(3篇)
- 北京市朝陽(yáng)區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末語(yǔ)文試題(解析版)
- 安徽省2025年普通高中學(xué)業(yè)水平合格性考試語(yǔ)文題庫(kù)及答案
- B細(xì)胞淋巴瘤課件
- 《這一次我全力以赴》(2023年廣東省中考滿分作文13篇附審題指導(dǎo))
- 空調(diào)技師考試題及答案
- FRNC-5PC工藝計(jì)算軟件操作的指南
- 人工智能工程質(zhì)量管理體系與措施
- 養(yǎng)老機(jī)構(gòu)殯葬協(xié)議書
- 12生肖英語(yǔ)課件
評(píng)論
0/150
提交評(píng)論