版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本章學(xué)習(xí)目標(biāo):●
理解異常的概念和異常處理機制●
理解Java異常的分類●
掌握try、catch、finally使用方法●
掌握throw、throws的使用方法●
掌握自定義異常的定義和使用方法第九章異常第1節(jié)part
異常概述
程序中的錯誤可以分為三類:語法錯誤、邏輯錯誤和運行時錯誤。程序經(jīng)過編譯和測試后,前兩種錯誤基本可以排除,但在程序運行過程中,仍然可能發(fā)生一些預(yù)料不到的情況導(dǎo)致程序出錯,這種在運行時出現(xiàn)的意外錯誤稱為“異常”。對異常的處理機制也成為判斷一種語言是否成熟的標(biāo)準(zhǔn)。好的異常處理機制會使程序員更容易寫出健壯的代碼,防止代碼中Bug的蔓延。在某些語言中,例如傳統(tǒng)的C語言沒有提供異常處理機制,程序員被迫使用多條if語句來檢測所有可能導(dǎo)致錯誤的條件,這樣會使代碼變得非常復(fù)雜。而目前主流的編程語言,例如Java、C++等都提供了成熟的異常處理機制,可以使程序中的異常處理代碼和正常的業(yè)務(wù)代碼分離,一旦出現(xiàn)異常,很容易查到并解決,提高了程序的健壯性。異常概述異常概述
程序發(fā)生異常時,有很多有用的信息需要保存,Java提供了豐富的異常類,當(dāng)異常發(fā)生時有運行時環(huán)境自動產(chǎn)生相應(yīng)異常類的對象保存相應(yīng)異常信息,這些異常類之間有嚴(yán)格的繼承關(guān)系。如圖9.1所示列舉了Java常見的異常類之間的繼承關(guān)系。9.1.1異常類異常類Java中的異常類可以分為兩種:
(1)錯誤(Error):一般指與虛擬機相關(guān)的問題,如系統(tǒng)崩潰、虛擬機錯誤、動態(tài)鏈接失敗等,這些錯誤無法恢復(fù)或捕獲,將導(dǎo)致應(yīng)用程序中斷。
(2)異常(Exception):因程序編碼錯誤或外在因素導(dǎo)致的問題,這些問題能夠被系統(tǒng)捕獲并進(jìn)行處理,從而避免應(yīng)用程序非正常中斷,例如:除以0、對負(fù)數(shù)開平方根、空指針訪問等。Throwable是所有異常類的父類,Error和Exception都繼承此類。當(dāng)程序產(chǎn)生Error時,因系統(tǒng)無法捕獲Error并處理,程序員將無能為力,程序只能中斷;而當(dāng)發(fā)生Exception時,系統(tǒng)可以捕獲并做出處理。9.1.1異常類Exception異常從編程角度又可以分為以下兩種類型:
(1)非檢查型異常:編譯器不要求強制處置的異常,該異常是因編碼或設(shè)計不當(dāng)導(dǎo)致的,這種異常可以避免,RuntimeException及其所有子類都屬于非檢查型異常。
(2)檢查型異常:編譯器要求及其子類必須處理的異常,該異常是程序運行時因外界因素而導(dǎo)致的,Exception及其子類(RuntimeException及其子類除外)都屬于檢查型異常。
常見的異常類說明如表9-1所示9.1.1異常類
檢查型異常體現(xiàn)了Java語言的嚴(yán)謹(jǐn)性,程序員必須對該類型的異常進(jìn)行處理,否則程序編譯不通過,無法運行。RuntimeException及其子類都是Exception的子類,Exception是所有能夠處理的異常的父類。
異常是在程序執(zhí)行期間產(chǎn)生的,會中斷正常的指令流,使程序不能正常執(zhí)行下去。例如,除法運算時被除數(shù)為0、數(shù)組下標(biāo)越界、字符串轉(zhuǎn)換為數(shù)值型等,都會產(chǎn)生異常,影響程序的正常運行。下述代碼示例了會產(chǎn)生被除數(shù)為0的算術(shù)異常,程序不能正常執(zhí)行完畢,最后的輸出語句不能輸出,代碼如下所示。9.1.2異常處理機制異常處理機制【代碼9.1】ExceptionExample.javapackagecom;publicclassExceptionExample{ publicstaticvoidmain(String[]args){ System.out.println("開始運行程序:"); //產(chǎn)生除以0的算術(shù)異常,程序中斷 inti=10/0; //因執(zhí)行上一句代碼時程序產(chǎn)生異常,中斷,該條語句不會執(zhí)行 System.out.println("異常處理機制"); }}9.1.2異常處理機制程序運行結(jié)果如下:開始運行程序:Exceptioninthread"main"java.lang.ArithmeticException:/byzero atcom.ExceptionExample1.main(ExceptionExample1.java:8)通過運行結(jié)果可以看到,程序出現(xiàn)異常將中斷運行。提示“/byzero”的ArithmeticException算術(shù)異常,最后輸出的語句沒有執(zhí)行。
為了使程序出現(xiàn)異常時也能正常運行下去,需要對異常進(jìn)行相關(guān)的處理操作,這種操作稱之為“異常處理”。Java的異常處理機制可以讓程序具有良好的容錯性,當(dāng)程序運行過程中出現(xiàn)意外情況發(fā)生時,系統(tǒng)會自動生成一個異常對象來通知程序,程序再根據(jù)異常對象的類型進(jìn)行相應(yīng)的處理。Java提供的異常處理機制有兩種:
(1)使用try…catch捕獲異常:將可能產(chǎn)生異常的代碼放在try語句中進(jìn)行隔離,如果遇到異常,程序會停止執(zhí)行try塊的代碼,跳到catch塊中進(jìn)行處理。
(2)使用throws聲明拋出異常:當(dāng)前方法不知道如何處理所出現(xiàn)的異常,該異常應(yīng)由上一級調(diào)用者進(jìn)行處理,可在定義該方法時使用throws聲明拋出異常。Java的異常處理機制具有以下幾個優(yōu)點:
(1)異常處理代碼和正常的業(yè)務(wù)代碼分離,提高了程序的可讀性,簡化了程序的結(jié)構(gòu),保證了程序的健壯性。
(2)將不同類型的異常進(jìn)行分類,不同情況的異常對應(yīng)不同的異常類,充分發(fā)揮類的可擴(kuò)展性和可重用性的優(yōu)勢。
(3)可以對程序產(chǎn)生的異常進(jìn)行靈活處理,如果當(dāng)前方法有能力處理異常,就使用try…catch捕獲并處理;否則使用throws聲明要拋出的異常,由該方法的上一級調(diào)用者來處理異常。9.1.2異常處理機制第2節(jié)part捕獲異常Java中捕獲異常并處理的語句有以下幾種:(1)try…catch語句(2)try…catch…finally語句(3)自動關(guān)閉資源的try語句(4)嵌套的try…catch語句(5)多異常捕獲捕獲異常捕獲異常9.2.1try…catch語句try…catch語句的基本語法格式如下:try{ //業(yè)務(wù)實現(xiàn)代碼(可能發(fā)生異常) ......}catch(異常類1異常對象){ //異常類1的處理代碼}catch(異常類2異常對象){ //異常類2的處理代碼}......//可以有多個catch語句catch(異常類n異常對象){ //異常類n的處理代碼}try…catch語句
其中:
(1)執(zhí)行try語句中的業(yè)務(wù)代碼出現(xiàn)異常時,系統(tǒng)會自動生成一個異常對象,該異常對象被提交給Java運行時環(huán)境,此過程稱為“拋出異?!?;
(2)當(dāng)Java運行時環(huán)境收到異常對象時,會尋找能處理該異常對象的catch語句,即跟catch語句中的異常類型進(jìn)行一一匹配,如果匹配成功,則執(zhí)行相應(yīng)的catch塊進(jìn)行處理,這個過程稱為“捕獲異?!?;
(3)try語句后可以有一條或多條catch語句,這是針對不同的異常類提供不同的異常處理方式。9.2.1try…catch語句1.單catch處理語句
單catch處理語句只有一個catch,是最簡單的捕獲異常處理語句。下面代碼示例了使用單catch處理語句對異常進(jìn)行捕獲并處理,代碼所示如下?!敬a9.2】SingleCatchExample.javapackagecom;publicclassSingleCatchExample{ publicstaticvoidmain(String[]args){ int[]array={1,2,3,4,5}; try{ //產(chǎn)生數(shù)組下標(biāo)越界異常 for(inti=0;i<=array.length;i++) System.out.print(array[i]+""); }catch(Exceptione){ //輸出異常信息 e.printStackTrace(); } System.out.println("程序運行結(jié)束"); }}
上述代碼中只有一條catch語句,其處理的異常類型是Exception。e是異常對象名,這里可以將每個catch塊看成一個方法,e就是形參,將來的實參是運行時環(huán)境根據(jù)錯誤情況自動產(chǎn)生的異常類對象,方法的調(diào)用是自動調(diào)用。而e.printStackTrace()方法將異常信息輸出。9.2.1try…catch語句
所有異常對象都包含以下幾個常用方法用于訪問異常信息:
(1)getMessage()方法:返回該異常的詳細(xì)描述字符串;
(2)printStackTrace()方法:將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯誤輸出;
(3)printStackTrace(PrintStreams)方法:將該異常的跟蹤棧信息輸出到指定輸出流;
(4)getStackTrace()方法:返回該異常的跟蹤棧信息。
程序運行結(jié)果如下所示:12345java.lang.ArrayIndexOutOfBoundsException:5 atcom.SingleCatchExample.main(SingleCatchExample.java:9)
程序運行結(jié)束9.2.1try…catch語句
通過運行結(jié)果可以分析出,當(dāng)執(zhí)行try塊中的語句產(chǎn)生異常時,try塊中剩下的代碼不會再執(zhí)行,而是執(zhí)行catch語句;catch語句處理結(jié)束后,程序繼續(xù)向下運行。因此,最后的輸出語句會被執(zhí)行,“程序運行結(jié)束”字符串被輸出顯示,程序正常退出。
單catch處理語句的執(zhí)行流程如圖9.2所示。9.2.1try…catch語句2.多catch語句
多catch處理語句有多個catch,是最常用的、針對不同異常進(jìn)行捕獲處理的語句。下述代碼示例了使用多個catch處理語句對多種異常進(jìn)行捕獲并處理,代碼如下所示?!敬a9.3】MultiCatchExample.javapackagecom;importjava.util.Scanner;publicclassMultiCatchExample{ publicstaticvoidmain(String[]args){ Scannerscanner=newScanner(System.in); intarray[]=newint[3]; try{ System.out.println("請輸入第1個數(shù):"); Stringstr=scanner.next();//從鍵盤獲取一個字符串 //將不是整數(shù)數(shù)字的字符串轉(zhuǎn)換成整數(shù),會引發(fā)NumberFormatException intn1=Integer.parseInt(str); System.out.println("請輸入第2個數(shù):"); intn2=scanner.nextInt();//從鍵盤獲取一個整數(shù) //兩個數(shù)相除,如果n2是0,會引發(fā)ArithmeticException array[1]=n1/n2;9.2.1try…catch語句 //給a[3]賦值,數(shù)組下標(biāo)越界,引發(fā)ArrayIndexOutOfBoundsException) array[3]=n1*n2; System.out.println("兩個數(shù)的和是"+(n1+n2)); }catch(NumberFormatExceptionex){ System.out.println("數(shù)字格式化異常!"); }catch(ArithmeticExceptionex){ System.out.println("算術(shù)異常!"); }catch(ArrayIndexOutOfBoundsExceptionex){ System.out.println("下標(biāo)越界異常!"); }catch(Exceptionex){ System.out.println("其他未知異常!"); } System.out.println("程序結(jié)束!"); }}
上述代碼中,try語句后跟著4條catch語句,分別針對NumberFormatException、ArithmeticException、ArrayIndexOutOfBoundsException和Exception這4種類型的異常進(jìn)行處理。根據(jù)輸入數(shù)據(jù)的不同,其執(zhí)行結(jié)果也會不同。9.2.1try…catch語句
當(dāng)從鍵盤輸入“xsc”時,將該字符串轉(zhuǎn)換成整數(shù)會產(chǎn)生NumberFormateException異常,因此對應(yīng)的異常處理會輸出“數(shù)字格式化異常!”,運行結(jié)果如下所示:
請輸入第1個數(shù):xsc
數(shù)字格式化異常!
程序結(jié)束!
當(dāng)輸入的第一個數(shù)是10,第二個數(shù)是“0”,則會產(chǎn)生ArithmeticException算術(shù)異常,運行結(jié)果如下所示:
請輸入第1個數(shù):10
請輸入第2個數(shù):0
算術(shù)異常!
程序結(jié)束!
當(dāng)輸入的兩個數(shù)都正確,則會執(zhí)行到“array[3]=n1*n2”語句,因數(shù)組a的長度為3,其下標(biāo)取值范圍是0~2,所以使用“array[3]”會產(chǎn)生數(shù)組下標(biāo)越界異常,運行結(jié)果如下所示:
請輸入第1個數(shù):18
請輸入第2個數(shù):2
下標(biāo)越界異常!
程序結(jié)束!9.2.1try…catch語句
由程序的運行結(jié)果可以看出,執(zhí)行多個catch處理語句時,當(dāng)異常對象被其中的一個catch語句捕獲,則剩下的catch語句將不再進(jìn)行匹配。多catch處理語句的執(zhí)行流程如圖9.3所示。
捕獲異常的順序和catch語句的順序有關(guān),因此安排catch語句的順序時,首先應(yīng)該捕獲一些子類異常,然后再捕獲父類異常。9.2.2try...catch...finally語句
在某些時候,程序在try塊中打開了一些物理資源,例如:數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接以及磁盤文件讀寫等,針對這些物理資源、不管是否有異常發(fā)生,都必須顯式回收;而在try塊中一旦發(fā)生異常,可能會跳過顯式回收代碼直接進(jìn)入catch塊,導(dǎo)致沒有正常回收資源。這種情況下就要求某些特定的代碼必須被執(zhí)行。Java垃圾回收機制不會回收任何物理資源,垃圾回收機制只能回收堆內(nèi)存中對象所占用的內(nèi)存。在Java程序中,通常使用finally回收物理資源。
在Java異常處理機制中,提供了finally塊,可以將回收代碼放入此塊中,不管try塊中的代碼是否出現(xiàn)異常,也不管哪一個catch塊被執(zhí)行,甚至在try塊或catch塊中執(zhí)行了return語句,finally塊都會被執(zhí)行try…catch…finally語句9.2.2try...catch...finally語句try…catch…finally語句的語法格式如下:try{ //業(yè)務(wù)實現(xiàn)代碼(可能發(fā)生異常) ......}catch(異常類1異常對象){//異常類1的處理代碼
}catch(異常類2異常對象){//異常類2的處理代碼
}......//可以有多個catch語句catch(異常類n異常對象){//異常類n的處理代碼
}finally{//資源回收語句
}
其中:1、try塊是必需的,catch塊和finally塊是可選的,但catch塊和finally塊二者至少出現(xiàn)其一,也可以同時出現(xiàn),即有兩種形式的用法:try…finally和try…catch…finally。2、try…catch…finally是語句的順序不能顛倒,所有的catch塊必須位于try塊之后,finally塊必須位于所有的catch塊之后。9.2.2try...catch...finally語句下述代碼演示try…catch…finally語句的使用,代碼如下所示?!敬a9.4】FinallyExample.javapackagecom;importjava.io.FileInputStream;importjava.io.IOException;publicclassFinallyExample{ publicstaticvoidmain(String[]args){ FileInputStreamfis=null; try{ //創(chuàng)建一個文件輸入流,讀指定的文件 fis=newFileInputStream("xsc.txt"); }catch(IOExceptionioe){ System.out.println(ioe.getMessage()); //return語句強制方法返回 return;//① //使用exit來退出應(yīng)用 //System.exit(0);//② }finally{9.2.2try...catch...finally語句 //關(guān)閉磁盤文件,回收資源 if(fis!=null){ try{ fis.close(); }catch(IOExceptionioe){ ioe.printStackTrace(); } } System.out.println("執(zhí)行finally塊里的資源回收!"); } }}
上述代碼在try塊中打開一個名為“zkl.txt”的磁盤文件;在catch塊中使用異常對象的getMessage()方法獲取異常信息,并使用輸出語句進(jìn)行顯示。在finally塊中關(guān)閉磁盤文件,回收資源。注意在程序的catch塊中①處有一條return語句,該語句強制方法返回。通常程序執(zhí)行到return語句時會立即結(jié)束當(dāng)前方法,但現(xiàn)在會在返回之前先執(zhí)行finally塊中的代碼。9.2.2try...catch...finally語句
運行結(jié)果如下所示:zkl.txt(系統(tǒng)找不到指定的文件。)
執(zhí)行finally塊里的資源回收!
將①處的return語句注釋掉,取消②處的代碼注釋,使用System.exit(0)語句退出整個應(yīng)用程序。因應(yīng)用程序不再執(zhí)行,所以finally塊中的代碼也失去執(zhí)行的機會,其運行結(jié)果如下所示:zkl.txt(系統(tǒng)找不到指定的文件。)9.2.2try...catch...finally語句try…catch…finally語句的執(zhí)行流程如圖9-5所示。9.2.2try...catch...finally語句
在上述的代碼中,關(guān)閉資源的代碼放在finally語句中,程序顯得有些繁瑣。從Java7開始,增強了try語句的功能,允許在try關(guān)鍵字后緊跟一對小括號,在小括號中可以聲明、初始化一個或多個資源,當(dāng)try語句執(zhí)行結(jié)束時會自動關(guān)閉這些資源。
自動關(guān)閉資源的try語句的語法格式如下:try(//聲明、初始化資源代碼){ //業(yè)務(wù)實現(xiàn)代碼(可能發(fā)生異常) ......}
自動關(guān)閉資源的try語句相當(dāng)于包含了隱式的finally塊,該finally塊用于關(guān)閉前面所訪問的資源。因此,自動關(guān)閉資源的try語句后面即可以沒有catch塊,也可以沒有finally塊。當(dāng)然,如果程序需要,自動關(guān)閉資源的try語句后也可以帶多個catch塊和一個finally塊。下述代碼修改了前面代碼程序,示例了如何使用自動關(guān)閉資源的try語句,代碼如下所示。9.2.2try...catch...finally語句【代碼9.5】AutoCloseTryExample.javapackagecom;importjava.io.FileInputStream;importjava.io.IOException;publicclassAutoCloseTryExample{ publicstaticvoidmain(String[]args){ //自動關(guān)閉資源的try語句,JDK7.0以上才支持 try(FileInputStreamfis=newFileInputStream("xsc.txt")){ //對文件的操作... }catch(IOExceptione){ System.out.println(e.getMessage()); } //包含了隱式的finally塊,fis.close()關(guān)閉資源 }}
上述代碼try關(guān)鍵字后緊跟一對小括號,在小括號中聲明并初始化一個文件輸入流,try語句會自動關(guān)閉該資源,這種寫法既簡潔又安全。
程序運行結(jié)果如下:zkl.txt(系統(tǒng)找不到指定的文件。)9.2.3嵌套的try...catch語句
在某些時候,需要使用嵌套的try…catch語句。例如,代碼塊的某一部分產(chǎn)生一個異常,而整個代碼塊又有可能引起另外一個異常,此時需要將一個異常處理嵌套到另一個異常處理中。
下述代碼示例了嵌套的try…catch語句的使用,代碼如下所示。嵌套的try…catch語句9.2.3嵌套的try...catch語句【代碼9.6】NestingTryExample.javapackagecom;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.Scanner;publicclassNestingTryExample{ publicstaticvoidmain(String[]args){ try{ Scannerscanner=newScanner(System.in); System.out.println("請輸入第一個數(shù):"); //從鍵盤獲取一個字符串 Stringstr=scanner.next(); //將不是整數(shù)數(shù)字的字符串轉(zhuǎn)換成整數(shù), //會引發(fā)NumberFormatException intn1=Integer.parseInt(str); try{ FileInputStreamfis=newFileInputStream("xsc.txt"); }catch(IOExceptione){ System.out.println(e.getMessage());
}9.2.3嵌套的try...catch語句 System.out.println("請輸入第二個數(shù):"); //從鍵盤獲取一個整數(shù) intn2=scanner.nextInt(); System.out.println("您輸入的兩個數(shù)的商是:"+n1/n2); }catch(Exceptionex){ ex.printStackTrace(); } System.out.println("程序到此結(jié)束!"); }}
上述代碼中,在一個try…catch語句中嵌套了另外一個try…catch語句。根據(jù)輸入內(nèi)容的不同,其運行結(jié)果也不同。
當(dāng)?shù)谝粋€數(shù)輸入“xsc”時,運行結(jié)果如下所示:
請輸入第一個數(shù):xscjava.lang.NumberFormatException:Forinputstring:"xsc"
程序到此結(jié)束! atjava.lang.NumberFormatException.forInputString(UnknownSource) atjava.lang.Integer.parseInt(UnknownSource) atjava.lang.Integer.parseInt(UnknownSource) atcom.NestingTryExample.main(NestingTryExample.java:14)9.2.3嵌套的try...catch語句當(dāng)?shù)谝粋€數(shù)輸入正確,但第二個數(shù)輸入“0”時,運行結(jié)果如下所示:請輸入第一個數(shù):10xsc.txt(系統(tǒng)找不到指定的文件。)請輸入第二個數(shù):0java.lang.ArithmeticException:/byzero程序到此結(jié)束! atcom.NestingTryExample.main(NestingTryExample.java:23)當(dāng)輸入兩個正確的數(shù),運行結(jié)果如下所示:請輸入第一個數(shù):10xsc.txt(系統(tǒng)找不到指定的文件。)請輸入第二個數(shù):5您輸入的兩個數(shù)的商是:2程序到此結(jié)束!使用嵌套的try…catch語句時,如果執(zhí)行內(nèi)部的try塊沒有遇到匹配的catch塊,則將檢查外部的catch塊。9.2.4多異常捕獲
在Java7以前,每個catch塊只能捕獲一種類型的異常。但從Java7開始,一個catch塊可以捕獲多種類型的異常。使用一個catch塊捕獲多種類型的異常時的語法格式如下:try{ //業(yè)務(wù)實現(xiàn)代碼(可能發(fā)生異常) ......}catch(異常類A[|異常類B...|異常類N]異常對象){ //多異常捕獲處理代碼}......//可以有多個catch語句多異常捕獲其中:(1)捕獲多種類型的異常時,多種異常類型之間使用豎杠“|”進(jìn)行間隔;(2)多異常捕獲時,異常變量默認(rèn)是常量,因此程序不能對該異常變量重新賦值。9.2.4多異常捕獲下述代碼示例了如何使用多異常捕獲,代碼如下所示。【代碼9.7】MultiExceptionExample.javapackagecom;importjava.util.Scanner;publicclassMultiExceptionExample{ publicstaticvoidmain(String[]args){ try{ Scannerscanner=newScanner(System.in); System.out.println("請輸入第一個數(shù):"); //從鍵盤獲取一個字符串 Stringstr=scanner.next(); //將不是整數(shù)數(shù)字的字符串轉(zhuǎn)換成整數(shù),//會引發(fā)NumberFormatException intn1=Integer.parseInt(str); System.out.println("請輸入第二個數(shù):"); //從鍵盤獲取一個整數(shù) intn2=scanner.nextInt(); System.out.println("您輸入的兩個數(shù)相除的結(jié)果是:"+n1/n2); }catch(ArrayIndexOutOfBoundsException |NumberFormatException|ArithmeticExceptione){
System.out.println("程序發(fā)生了數(shù)組越界、數(shù)字格式異常、算術(shù)異常之一");9.2.4多異常捕獲 //捕捉多異常時,異常變量ie是默認(rèn)是常量,不能重新賦值。//下面一條賦值語句錯誤! //e=newArithmeticException("Test");//① }catch(Exceptione){ System.out.println("未知異常"); //捕捉一個類型的異常時,異常變量e可以被重新賦值。//下面一條賦值語句正確! e=newRuntimeException("Test");//② } }}
上述代碼中,第一個catch語句使用多異常捕獲,該catch可以捕獲處理ArrayIndexOutOfBoundsException、NumberFormatException和ArithmeticException三種類型的異常。多異常捕獲時,異常變量默認(rèn)是常量,因此程序中①處的代碼是錯誤的,而②的代碼是正確的。第3節(jié)part拋出異常Java中拋出異??梢允褂胻hrow或throws關(guān)鍵字:
(1)使用throw拋出一個異常對象:當(dāng)程序出現(xiàn)異常時,系統(tǒng)會自動拋出異常,除此之外,Java也允許程序使用代碼自行拋出異常,自行拋出異常使用throw語句完成.
(2)使用throws聲明拋出一個異常序列:throws只能在定義方法時使用。當(dāng)定義的方法不知道如何處理所出現(xiàn)的異常,而該異常應(yīng)由上一級調(diào)用者進(jìn)行處理,可在定義該方法時使用throws聲明拋出異常。拋出異常本節(jié)概述9.3.1throw拋出異常對象
在程序中,如果需要根據(jù)業(yè)務(wù)邏輯自行拋出異常,則應(yīng)該使用throw語句。throw語句拋出的不是異常類,而是一個異常實例對象,并且每次只能拋出一個異常實例對象。throw拋出異常對象的語法格式如下:throw異常對象
下述代碼示例了throw語句的使用,代碼如下所示。throw拋出異常對象9.3.1throw拋出異常對象【代碼9.8】ThrowExample.javapackagecom;importjava.util.Scanner;publicclassThrowExample{ publicstaticvoidmain(String[]args){ Scannerscanner=newScanner(System.in); try{ System.out.println("請輸入年齡:"); //從鍵盤獲取一個整數(shù) intage=scanner.nextInt(); if(age<0||age>100){ //拋出一個異常對象 thrownewException("請輸入一個合法的年齡,年齡必須在0~100之間"); } }catch(Exceptionex){ ex.printStackTrace(); } System.out.println("程序到此結(jié)束!"); }}9.3.1throw拋出異常對象
上述代碼中,當(dāng)用戶輸入的年齡不在0~100之間時,會使用throw拋出一個異常對象。程序運行結(jié)果如下:
請輸入年齡:120
程序到此結(jié)束!java.lang.Exception:請輸入一個合法的年齡,年齡必須在0~100之間 atcom.ThrowExample.main(ThrowExample.java:12)9.3.2throw聲明拋出異常序列throws聲明拋出異常序列的語法格式如下:[訪問符]<返回類型>方法名([參數(shù)列表])throws異常類A[,異常類B...,異常類N]{ //方法體}下述代碼示例了throws語句的使用,代碼如下所示。Throw聲明拋出異常序列9.3.2throw聲明拋出異常序列【代碼9.9】ThrowsExample.javapackagecom;importjava.util.Scanner;publicclassThrowsExample{ //定義一個方法,該方法使用throws聲明拋出異常 publicvoidmyThrowsFunction()throwsNumberFormatException, ArithmeticException,Exception{ Scannerscanner=newScanner(System.in); System.out.println("請輸入第一個數(shù):"); Stringstr=scanner.next();//從鍵盤獲取一個字符串 //將不是整數(shù)數(shù)字的字符串轉(zhuǎn)換成整數(shù), //會引發(fā)NumberFormatException intn1=Integer.parseInt(str); System.out.println("請輸入第二個數(shù):"); intn2=scanner.nextInt();//從鍵盤獲取一個整數(shù) System.out.println("您輸入的兩個數(shù)相除的結(jié)果是:"+n1/n2); } publicstaticvoidmain(String[]args){ ThrowsExamplete=newThrowsExample();
9.3.2throw聲明拋出異常序列 try{ //調(diào)用帶拋出異常序列的方法 te.myThrowsFunction(); }catch(NumberFormatExceptione){ e.printStackTrace(); }catch(ArithmeticExceptione){ e.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); } }}
上述代碼中,在定義myThrowsFunction()方法時,該方法后面直接使用throws關(guān)鍵字拋出NumberFormatException、ArithmeticException和Exception三種類型的異常,這三種異常類之間使用逗號“,”間隔。這表明myThrowsFunction()方法會產(chǎn)生異常,但該方法本身沒有對異常進(jìn)行捕獲處理(方法體內(nèi)沒有異常處理語句),在調(diào)用該方法時就需要對異常進(jìn)行捕獲處理。9.3.2throw聲明拋出異常序列程序運行結(jié)果如下:請輸入第一個數(shù):10請輸入第二個數(shù):xscjava.util.InputMismatchException atjava.util.Scanner.throwFor(UnknownSource) atjava.util.Scanner.next(UnknownSource) atjava.u
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國CG(計算機圖像)行業(yè)開拓第二增長曲線戰(zhàn)略制定與實施研究報告
- 2025-2030年中國鈑金加工行業(yè)全國市場開拓戰(zhàn)略制定與實施研究報告
- 2025-2030年中國燃料電池行業(yè)開拓第二增長曲線戰(zhàn)略制定與實施研究報告
- 2025-2030年中國MLCC行業(yè)并購重組擴(kuò)張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國辦公物業(yè)管理行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 包裝禮品行業(yè)深度研究報告
- 中國玩具藝眼藝鼻項目投資可行性研究報告
- 農(nóng)業(yè)生產(chǎn)結(jié)構(gòu)與布局
- 電氣作業(yè)相關(guān)知識培訓(xùn)課件
- 二零二五年度建筑垃圾運輸與再生資源開發(fā)合同3篇
- 《水下拋石基床振動夯實及整平施工規(guī)程》
- 現(xiàn)代學(xué)徒制課題:數(shù)字化轉(zhuǎn)型背景下新型師徒關(guān)系構(gòu)建研究(附:研究思路模板、可修改技術(shù)路線圖)
- 9.2溶解度(第2課時)-2024-2025學(xué)年九年級化學(xué)人教版(2024)下冊
- 安徽省合肥市包河區(qū)2023-2024學(xué)年三年級上學(xué)期語文期末試卷
- 2024版食源性疾病培訓(xùn)完整課件
- 2025年中國蛋糕行業(yè)市場規(guī)模及發(fā)展前景研究報告(智研咨詢發(fā)布)
- 護(hù)理組長年底述職報告
- 巨量引擎合同范本
- 《住院患者身體約束的護(hù)理》團(tuán)體標(biāo)準(zhǔn)解讀課件
- 初中語文:非連續(xù)性文本閱讀練習(xí)(含答案)
- 中考英語過去將來時趣味講解動態(tài)課件(43張課件)
評論
0/150
提交評論