版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章JAVA異常處理第6章JAVA異常處理6.1異常的概念6.2異常處理6.3自定義異常生活中的異常正常情況下,小王每日開(kāi)車(chē)去上班,耗時(shí)大約30分鐘但是,異常情況遲早要發(fā)生!一路暢通堵車(chē)!撞車(chē)!什么是異常異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的不正常的事件,它會(huì)中斷正在運(yùn)行的程序繞行或者等待請(qǐng)求交警解決異常!面對(duì)異常該怎么辦呢?通常情況下,我們會(huì)這樣處理:程序運(yùn)行程序中斷運(yùn)行堵車(chē)!撞車(chē)!生活中,我們會(huì)根據(jù)不同的異常進(jìn)行相應(yīng)的處理,而不會(huì)就此中斷我們的生活6.1異常的概念1.什么是異常?
異常是在程序運(yùn)行過(guò)程中所發(fā)生的破壞了正常的指令流程的事件。軟件和硬件錯(cuò)誤都可能導(dǎo)致異常的產(chǎn)生。程序運(yùn)行出現(xiàn)異常時(shí),Java運(yùn)行環(huán)境就用異常類Exception的相應(yīng)子類創(chuàng)建一個(gè)異常對(duì)象,并等待處理程序中的異常publicclassExcepNoCatch{ publicstaticvoidmain(String[]args){
inti=0; Stringgreetings[]={ "Helloworld!", "No,Imeanit!", "HELLOWORLD!!" }; while(i<4){ System.out.println(greetings[i]); i++; } }}什么是異常處理Java編程語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力程序中預(yù)先想好了對(duì)付異常的處理辦法異常!程序運(yùn)行處理完畢,程序繼續(xù)運(yùn)行對(duì)異常進(jìn)行處理2.Java處理異常的機(jī)制異常處理可分為以下幾個(gè)步驟:1)拋出異常:當(dāng)方法中有一個(gè)錯(cuò)誤發(fā)生后,該方法創(chuàng)建一個(gè)異常對(duì)象并把它交給運(yùn)行時(shí)系統(tǒng)。2)捕獲異常:運(yùn)行時(shí)系統(tǒng)在方法調(diào)用堆棧里為被拋出的異常查找處理代碼。3)異常處理:通過(guò)方法調(diào)用來(lái)處理異常4)異常終止:如果運(yùn)行時(shí)系統(tǒng)在方法調(diào)用棧查遍了所有的方法而未找到合適的異常處理程序,則運(yùn)行是系統(tǒng)終止執(zhí)行。2.Java處理異常的機(jī)制異常發(fā)生拋出異常JAVA虛擬機(jī)強(qiáng)制拋出生動(dòng)自成異常類對(duì)象異常處理代碼捕獲異常捕獲異常異常類對(duì)象終止程序2.Java處理異常的機(jī)制可以靈活的處理異常,如果當(dāng)前方法有能力處理異常,就捕獲并處理它,否則只需拋出異常,由方法調(diào)用者來(lái)處理它。異常流程的代碼和正常流程的代碼分離,提高了程序的可讀性,簡(jiǎn)化了程序的結(jié)構(gòu)。Java處理異常的機(jī)制的特點(diǎn):用Java類來(lái)表示異常情況,這種類被稱為異常類。把異常情況表示成異常類,可以充分發(fā)揮類的可擴(kuò)展和可重用的優(yōu)勢(shì)。Java中異常類的結(jié)構(gòu)Java中如何進(jìn)行異常處理Java的異常處理是通過(guò)5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:try、catch、finally、throw、throws捕獲異常catchtryfinally執(zhí)行可能產(chǎn)生異常的代碼捕獲異常無(wú)論是否發(fā)生異常,代碼總能執(zhí)行手動(dòng)拋出異常拋出異常throw聲明異常聲明方法可能要拋出的各種異常throwstry/catch塊-1trycatch
try/catch
塊后的代碼段publicvoidmethod(){try{//代碼段(此處不會(huì)產(chǎn)生異常)}catch(異常類型
ex){//對(duì)異常進(jìn)行處理的代碼段}//代碼段}使用try/catch塊捕獲異常,分為三種情況:第一種情況try/catch塊-2使用示例模擬第一種情況:publicclassMyException{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#編程"); break; case2:
System.out.println("Java編程"); break; case3:
System.out.println("SQL基礎(chǔ)");}}catch(Exceptionex){
System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}}輸入:2Java編程歡迎提出建議!控制臺(tái)輸出try/catch塊-3trycatch異常類型匹配try/catch塊后的代碼段進(jìn)入catch塊publicvoidmethod(){try{//代碼段1//產(chǎn)生異常的代碼段2//代碼段3}catch(異常類型
ex){//對(duì)異常進(jìn)行處理的代碼段4}//代碼段5}使用try/catch塊捕獲異常,分為三種情況:第二種情況產(chǎn)生異常對(duì)象程序繼續(xù)執(zhí)行異常是一種特殊的對(duì)象,類型為java.lang.Exception或其子類
發(fā)生異常try/catch塊-4使用示例模擬第二種情況:publicclassMyException{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#編程"); break; case2:
System.out.println("Java編程"); break; case3:
System.out.println("SQL基礎(chǔ)");}}catch(Exceptionex){
System.out.println("輸入不為數(shù)字!");
ex.printStackTrace();}System.out.println("歡迎提出建議!");}}輸入:B輸入不為數(shù)字!異常堆棧信息歡迎提出建議!控制臺(tái)輸出printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程publicclassMyException{publicstaticvoidmain(String[]args){
System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try
{intcourseCode=in.nextInt();//此處代碼省略
}catch(Exceptionex){
System.out.println("輸入不為數(shù)字!");
ex.printStackTrace();}
System.out.println("歡迎提出建議!");}}try/catch塊-5java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:840)atjava.util.Scanner.next(Scanner.java:1461)atjava.util.Scanner.nextInt(Scanner.java:2091)atjava.util.Scanner.nextInt(Scanner.java:2050)ats2jsp.sg.ch05.MyException.main(MyException.java:23)異常類型異常堆棧信息在此方法中拋出了異常try/catch塊-6trycatch異常類型不匹配try/catch塊后的代碼段程序中斷運(yùn)行
發(fā)生異常publicvoidmethod(){try{//代碼段1//產(chǎn)生異常的代碼段2//代碼段3}catch(異常類型
ex){//對(duì)異常進(jìn)行處理的代碼段4}//代碼段5}使用try/catch塊捕獲異常,分為三種情況:第三種情況產(chǎn)生異常對(duì)象try/catch塊-7使用示例模擬第三種情況:publicclassMyException2{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#編程"); break; case2:
System.out.println("Java編程"); break; case3:
System.out.println("SQL基礎(chǔ)");}}catch(NullPointerExceptionex){
System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}}輸入:B程序中斷運(yùn)行finally語(yǔ)句finally語(yǔ)句定義一個(gè)總是被執(zhí)行的代碼塊,而不管有沒(méi)有出現(xiàn)異常。publicvoidwork(){try{
開(kāi)門(mén)工作8個(gè)小時(shí)//可能會(huì)拋出異常
}catch(DiseaseExceptione){
去醫(yī)院看病;}finally{
關(guān)門(mén)
}}publicvoidwork(){try{
開(kāi)門(mén)工作8個(gè)小時(shí)//可能會(huì)拋出異常
關(guān)門(mén)
}catch(DiseaseExceptione){
去醫(yī)院看病;}}try/catch/finally-1在try/catch塊后加入finally塊,可以確保無(wú)論是否發(fā)生異常,finally塊中的代碼總能被執(zhí)行try塊finally塊catch塊無(wú)異常有異常try/catch/finally-2publicclassMyException3{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#編程"); break; case2:
System.out.println("Java編程"); break; case3:
System.out.println("SQL基礎(chǔ)");}}catch(Exceptionex){
System.out.println("輸入不為數(shù)字!");}finally
{
System.out.println("歡迎提出建議!");}}}輸入:2Java編程歡迎提出建議!控制臺(tái)輸出輸入:B輸入不為數(shù)字!歡迎提出建議!第一種情況:無(wú)異常第二種情況:有異常編寫(xiě)一個(gè)類ExceptionTest1,在main方法中使用try、catch、finally:在try塊中,編寫(xiě)被0除的代碼在catch塊中,捕獲被0除所產(chǎn)生的異常,并且打印異常信息在finally塊中,打印一條語(yǔ)句多重catch塊-1一段代碼可能會(huì)引發(fā)多種類型的異常當(dāng)引發(fā)異常時(shí),會(huì)按順序來(lái)查看每個(gè)catch
語(yǔ)句,并執(zhí)行第一個(gè)與異常類型匹配的catch語(yǔ)句執(zhí)行其中的一條catch語(yǔ)句之后,其后的catch語(yǔ)句將被忽略publicvoidmethod(){try{//代碼段
//產(chǎn)生異常(異常類型2)}catch(異常類型1ex){//對(duì)異常進(jìn)行處理的代碼段}catch(異常類型2ex){//對(duì)異常進(jìn)行處理的代碼段}catch(異常類型3ex){//對(duì)異常進(jìn)行處理的代碼段}//代碼段}多重catch塊-2try與異常類型1不匹配try/catch塊后的代碼段發(fā)生異常產(chǎn)生異常對(duì)象catch與異常類型2匹配catchcatch程序繼續(xù)執(zhí)行進(jìn)入catch塊多重catch塊-3publicclassMyException4{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);try{System.out.print(“請(qǐng)輸入互聯(lián)網(wǎng)專業(yè)的總學(xué)時(shí):");inttotalTime=in.nextInt();//總學(xué)時(shí)System.out.print(“請(qǐng)輸入互聯(lián)網(wǎng)專業(yè)的課程數(shù)目:");inttotalCourse=in.nextInt();//課程數(shù)目System.out.println(“互聯(lián)網(wǎng)專業(yè)的各課程的平均學(xué)時(shí)為:"+totalTime/totalCourse);}catch(InputMismatchException
e1){System.out.println("輸入不為數(shù)字!");}catch(ArithmeticExceptione2){System.out.println("課程數(shù)目不能為零!");}catch(Exceptione){System.out.println("發(fā)生錯(cuò)誤:"+e.getMessage());}}}輸入:270H在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化,即先子類后父類輸出:輸入不為數(shù)字!進(jìn)入第一個(gè)catch塊輸入:2700輸出:課程數(shù)目不能為零!進(jìn)入第二個(gè)catch塊聲明異常如果一個(gè)方法不想處理異常,或者異常沒(méi)有在當(dāng)前的try–catch中處理,則它必須將異常拋棄給上一級(jí)調(diào)用它的方法??梢酝ㄟ^(guò)throws語(yǔ)句將異常拋向上級(jí)調(diào)用方法。如果異常被回溯到main方法仍舊沒(méi)有處理,則程序?qū)⒊鲥e(cuò),終止運(yùn)行。聲明異常publicclassExTester{staticintmethod1(intx)throwsException{if(x<0)thrownewException("x<0");return++x;}
staticintmethod2(intx)throwsException{returnmethod1(x);}
publicstaticvoidmain(Stringargs[])throwsException{System.out.println(method2(-1));}}main()method2()method1()方法調(diào)用堆棧異常處理采用堆棧機(jī)制聲明異常publicclassTeacher{privateStringid;//教師編號(hào),長(zhǎng)度應(yīng)為7publicvoidsetId(String
pId)throws
IllegalArgumentException{//判斷教師編號(hào)的長(zhǎng)度是否為7if(pId.length()==7){id=pId;}else{thrownewIllegalArgumentException("參數(shù)長(zhǎng)度應(yīng)為7!");}}}publicclassTeacherTest{publicstaticvoidmain(String[]args){Teacherteacher=newTeacher();try{teacher.setId("088");}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}由調(diào)用者捕獲異常聲明該方法可能會(huì)產(chǎn)生異常拋出異常在JAVA程序中,引發(fā)異常共有以下兩種方式使用顯式throw語(yǔ)句來(lái)引發(fā)異常。在此情況下,控制權(quán)將無(wú)條件轉(zhuǎn)到處理異常的部分代碼使用語(yǔ)句或表達(dá)式在執(zhí)行過(guò)程中激發(fā)了某個(gè)異常的條件,使得操作無(wú)法正常結(jié)束,從而引發(fā)異常throw語(yǔ)句用于立即無(wú)條件地引發(fā)異常,語(yǔ)法格式為:throw[異常對(duì)象];拋出異常如果在當(dāng)前環(huán)境無(wú)法解決一個(gè)異常,就要將其拋出,把異常交給調(diào)用者處理publicclassTeacher{privateStringid;//教師編號(hào),長(zhǎng)度應(yīng)為7publicvoidsetId(String
pId){//判斷教師編號(hào)的長(zhǎng)度是否為7if(pId.length()==7){id=pId;}else{thrownewIllegalArgumentException("參數(shù)長(zhǎng)度應(yīng)為7!");}}}publicclassTeacherTest{publicstaticvoidmain(String[]args){Teacherteacher=newTeacher();try{teacher.setId("088");}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}拋出異常捕獲異常參數(shù)長(zhǎng)度應(yīng)為7!控制臺(tái)輸出編寫(xiě)類ExceptionTest2:定義兩個(gè)方法:go()和main()在go方法中聲明要拋出異常,在該方法體內(nèi),拋出一個(gè)Exception對(duì)象在main()方法中,調(diào)用go方法,使用try/catch捕獲go方法中拋出的異常自定義異常類使用自定義異常的步驟:
1.通過(guò)繼承java.lang.Exception類聲明自己的異常類;
2.在方法中生成自定義異常的實(shí)例,并用throw語(yǔ)句拋出;
3.在方法的聲明部分用throws語(yǔ)句聲明該方法可能拋出的異常
import
java.io.*
;
class
MyException
extends
Exception{
private
int
id
;
public
MyException(String
message
,int
id)
{
super(message)
;
this.id
=
id
;
}
public
int
getId()
{
return
id
;
}
}
public
class
TestMyException{
public
void
regist(int
num)
throws
MyException
{
if(num
<
0)
{
throw
new
MyException("人數(shù)不能為負(fù)值",3)
;
}
System.out.println("人數(shù):"
+
num)
;
}
public
void
manager()
{
try{
regist(-100)
;
}
catch(MyException
e)
{
System.out.println("錯(cuò)誤!錯(cuò)誤代碼:"
+
e.getId())
;
e.printStackTrace()
;
}
System.out.println("操作結(jié)束")
;
}
public
static
void
main(String
args[])
{
TestMyException
t
=
new
TestMyException()
;
t.manager()
;
}
}用戶定義異常用戶定義異常是通過(guò)擴(kuò)展Exception類或RuntimeException來(lái)創(chuàng)建的。
classAnswerWrongExceptionextendsException{privateintresult;publicAnswerWrongException(intresult){this.result=result;}publicint
getResult(){returnresult;}}用戶定義異常publicclassExceptionTester{publicstaticvoidtest(int
x,int
y,intz)throwsAnswerWrongException{if(x+y!=z)thrownewAnswerWrongException(z);
System.out.println(x+"+"+y+"="+z);}publicstaticvoidmain(Stringargs[]){try{test(1,2,5);
System.out.println("end");}catch(AnswerWrongExceptione){
System.out.println("resultiswrong:"+e.getResult());
e.printStackTrace();}}}獲得異常信息Exception提供了如下方法:
toString()
getMessage()
printStackTrace()try{test(1,2,5);
System.out.println("end");}catch(AnswerWrongExceptione){
e.printStackTrace();}異常處理流程finally語(yǔ)句不被執(zhí)行的唯一情況是程序先執(zhí)行了終止程序的System.exit()方法publicstaticvoidmain(String
args[]){try{
System.out.println("Begin");System.exit(0);}finally{
System.out.println("Finally");}
System.out.println("End");}異常處理流程publicstaticvoidmain(Stringargs[])throwsException{
try{
System.out.println("Begin");newSample().method1(-1);//出現(xiàn)SpecialException異常
System.exit(0);}catch(Exceptione){
System.out.println("Wrong");throwe;//如果把此行注釋掉,將得到不同的運(yùn)行結(jié)果
}finally{
System.out.println("Finally");}
System.out.println("End");}打印Begin
Wrong
Finallyjava.lang.SpecialException
異常處理流程publicstaticintmethod1(intx){try{if(x<0)thrownewException("x<0");returnx++;}catch(Exceptione){
System.out.println(“Wrong");return-100;}finally{
System.out.println("Finally");}}publicstaticvoidmain(Stringargs[]){
System.out.println(method1(-1));}打印Wrong
Finally-100常見(jiàn)異常ArithmeticException:數(shù)學(xué)異常inta=12/0;//拋出ArithmeticExceptionNullPointerException:空指針異常Dated=null;System.out.println(d.toString());//拋出NullPointerExceptionArrayIndexOutOfBoundsException:下標(biāo)越界異常int[]array=newint[4];array[0]=1;array[7]=1;//拋出ArrayIndexOutOfBoundsExceptionClassCastException:類型轉(zhuǎn)換異常:Animalanimal=newDog();Catcat=(Animal)animal;運(yùn)行時(shí)異常
RuntimeException類及其子類都稱為運(yùn)行時(shí)異常,這種異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,即使沒(méi)有用try-catch語(yǔ)句捕獲它,也沒(méi)有用throws子句聲明拋出它,也會(huì)編譯通過(guò)。例如當(dāng)以下divide()方法的參數(shù)b為0,執(zhí)行“a/b”操作時(shí)會(huì)出現(xiàn)ArrithmeticException異常,它屬于運(yùn)行時(shí)異常,Java編譯器不會(huì)檢查它:publicint
divide(int
a,intb){returna/b;//當(dāng)參數(shù)b為0,拋出ArrithmeticException}
區(qū)分運(yùn)行時(shí)異常和受檢查異常運(yùn)行時(shí)異常表示無(wú)法讓程序恢復(fù)運(yùn)行的異常,導(dǎo)致這種異常的原因通常是由于執(zhí)行了錯(cuò)誤操作。一旦出現(xiàn)了錯(cuò)誤操作,建議終止程序,因此Java編譯器不檢查這種異常。
publicvoidmethod(int[]array){
for(inti=0;i<=array.length;i++)//當(dāng)i的取值為array.length時(shí),將拋出ArrayIndexOutOfBoundsExceptionarray[i]=1;}publicvoidmethod(int[]array){
for(inti=0;i<array.length;i++)array[i]=1;//不會(huì)拋出ArrayIndexOutOfBoundsException}修改程序代碼中的錯(cuò)誤區(qū)分運(yùn)行時(shí)異常和受檢查異常受檢查異常表示程序可以處理的異常,如果拋出異常的方法本身不能處理它,那么方法調(diào)用者應(yīng)該去處理它,從而使程序恢復(fù)運(yùn)行,不至于終止程序。
如果一個(gè)方法可能出現(xiàn)受檢查異常,要么用try-catch語(yǔ)句捕獲,要么用throws子句聲明將它拋出,否則會(huì)導(dǎo)致編譯錯(cuò)誤。
voidmethod1()thro
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣象站監(jiān)控設(shè)施安裝協(xié)議
- 河岸護(hù)坡植草磚施工合同
- 酒吧現(xiàn)場(chǎng)布置設(shè)計(jì)師合同
- 水泥攪拌樁工程合同住宅小區(qū)建設(shè)
- 學(xué)校教職工專車(chē)司機(jī)聘用協(xié)議
- 地下管線探測(cè)挖機(jī)租賃協(xié)議
- 通信行業(yè)用電合同范例
- 速遞員聘用合同模板
- 工程勞工合同范例
- 草籽綠化合同
- 金屬擠壓共(有色擠壓工)中級(jí)復(fù)習(xí)資料練習(xí)試題附答案
- 投標(biāo)報(bào)價(jià)得分計(jì)算表Excele
- 醫(yī)院放射科輻射評(píng)估報(bào)告
- 小學(xué)數(shù)學(xué)問(wèn)題解決能力的培養(yǎng)策略
- 【“農(nóng)超對(duì)接”對(duì)農(nóng)戶收入的影響調(diào)查報(bào)告8700字】
- 2023高二英語(yǔ)外研版新教材選擇性必修二全冊(cè)課文原文(精校)
- 生物研究性學(xué)習(xí)活動(dòng)結(jié)題報(bào)告質(zhì)壁分離
- 交通運(yùn)輸風(fēng)險(xiǎn)點(diǎn)危險(xiǎn)源排查管控清單
- 堡坎承包合同
- 羊胎盤(pán)藥材質(zhì)量標(biāo)準(zhǔn)
- 眾辰變頻器z2400t-15gy-1說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論