風險行為解決方案-異常處理_第1頁
風險行為解決方案-異常處理_第2頁
風險行為解決方案-異常處理_第3頁
風險行為解決方案-異常處理_第4頁
風險行為解決方案-異常處理_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章風險行為解決方案——異常處理本章案例加法器的異常處理除法器的異常處理案例演示預習檢查什么是異常?Java中如何進行異常處理?請說明throw與throws的區(qū)別與聯(lián)系?提問本章摘要生活中的異常程序中的異常異常的種類異常的產(chǎn)生異常的處理(捕獲、拋出)一、現(xiàn)實世界中的異常什么是異常?異常就是不正常,比如說出門忘了帶鑰匙,上班途中自行車爆胎,到了公司忘了打卡,上廁所手機掉到馬桶里。這些不正常的事情雖然只是偶爾發(fā)生,但是一旦降落到你的頭上就是件非常麻煩的事。那么Java程序中會不會發(fā)生異常呢?下面我們就來看一看:二、程序中的異常我們來完成一個簡單的加法器:從控制臺輸入兩個數(shù)字,程序計算出這兩個數(shù)字的和,看看會不會出現(xiàn)異常:publicclassAddition{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù):");doublenum1=input.nextDouble();doublenum2=input.nextDouble();doubleresult=num1+num2;System.out.println("兩個數(shù)的和是:"+result);System.out.println("歡迎使用!");}}正常情況:錄入:100和200輸出:兩個數(shù)的和是:300歡迎使用!不正常情況:錄入:100和a程序會中斷運行

異常的概念異常是程序在執(zhí)行時發(fā)生的不正常事件,它會打斷程序的正常運行。產(chǎn)生異常!程序正常運行程序中斷運行現(xiàn)實世界中的異常我們都會想辦法解決掉,我們會根據(jù)不同的異常情況進行相應的處理,而不會視而不見。處理完成后,生活還會繼續(xù)。撈出來修理后手機掉到廁所里!補胎后上班自行車爆胎!三、異常的種類

受檢異常和非受檢異常

(CheckedExceptionandUncheckedException)根據(jù)編譯時檢測到否,分為受檢異常、非受檢異常受檢異常預期會發(fā)生的異常,必須處理才能通過編譯處理:在方法聲明時通過throws轉(zhuǎn)移在方法中捕獲后進行處理非受檢異常發(fā)生在程序執(zhí)行期間,不能預測它的發(fā)生,編譯器不要求一定要進行處理分為:錯誤(Errors)和運行時異常(RuntimeExceptions)錯誤常常指致命性錯誤,無法處理運行時異常只有在運行時才能被發(fā)現(xiàn),要求程序處理如:數(shù)組的下標越界、打開不存在的文件、網(wǎng)絡無法連接、操作數(shù)超出所要求的范圍、少了所需加載的類、自定義異常異常相關(guān)類的繼承關(guān)系異常是以類的形式進行封裝的?!怑xception的子類

RuntimeException的子類四、異常的產(chǎn)生產(chǎn)生時機:在程序執(zhí)行時自動發(fā)現(xiàn)并產(chǎn)生在程序中用throw語句顯式生成、拋出異常throwjava.lang.Throwable類型的變量;如:thrownewArithmeticException();thrownewArrayIndexOutOfBoundsException();五、異常的處理Java異常處理機制——在程序代碼執(zhí)行過程中出現(xiàn)異常后,按照我們預先制定的處理方法對異常進行處理,異常處理完成后,程序會繼續(xù)運行下去。程序中預先制定的處理方法對異常進行處理產(chǎn)生異常!程序正常運行處理完畢,程序繼續(xù)運行對異常進行處理Java中如何進行異常處理Java異常處理的五虎上將:try、catch、finally、throw、throws5個關(guān)鍵字。在方法中手動拋出異常聲明方法有可能拋出的各種異常

tryfinallycatchthrowsthrow有可能會出現(xiàn)異常的代碼一定要放到try代碼塊中不管有沒有異常都要執(zhí)行的代碼捕獲和處理異常異常處理的方式之一:try-catch塊在try-catch塊中,try語句塊中代碼執(zhí)行時會發(fā)生以下3種情況之一:trycatch執(zhí)行try-catch后程序代碼第一種情況:try語句塊中代碼正常執(zhí)行完畢,沒有任何異常,那么catch語句塊的代碼將不會被執(zhí)行。try-catch塊第一種情況代碼示例:

publicclassAddition1{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù):");

try{doublenum1=input.nextDouble();doublenum2=input.nextDouble();doubleresult=num1+num2;System.out.println("兩個數(shù)的和是:"+result);}catch(Exceptionex){System.out.println("對不起,不伺候!請錄入數(shù)字!");ex.printStackTrace();}System.out.println("歡迎使用!");}}正常情況:錄入:100和200輸出:兩個數(shù)的和是:300歡迎使用!try-catch塊在try-catch塊中,try語句塊中代碼執(zhí)行時會發(fā)生以下3種情況之一:trycatch執(zhí)行catch后程序繼續(xù)正常運行第二種情況:try語句塊中代碼執(zhí)行過程中產(chǎn)生異常,并且該異常跟catch中聲明的異常類型相符合,那么try語句塊中剩余的代碼將被忽略,catch語句塊的代碼將被執(zhí)行。異常

引發(fā)異常類型相符合

進入catchtry-catch塊第二種情況代碼示例:

publicclassAddition1{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù):");

try{doublenum1=input.nextDouble();doublenum2=input.nextDouble();doubleresult=num1+num2;System.out.println("兩個數(shù)的和是:"+result);}catch(Exceptionex){System.out.println("對不起,不伺候!請錄入數(shù)字!");

ex.printStackTrace();}System.out.println("歡迎使用!");}}不正常情況:錄入:100和a輸出:對不起,不伺候!請錄入數(shù)字!歡迎使用!異常堆棧段信息try-catch塊在try-catch塊中,try語句塊中代碼執(zhí)行時會發(fā)生以下3種情況之一:trycatch異常

引發(fā)第三種情況:try語句塊中代碼執(zhí)行過程中產(chǎn)生異常,但是拋出的異常并沒有在catch語句塊中聲明,那么這個時候程序會立刻終止。異常類型不匹配try-catch后程序代碼程序中斷運行try-catch塊第三種情況代碼示例:

publicclassAddition2{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù):");

try{doublenum1=input.nextDouble();doublenum2=input.nextDouble();doubleresult=num1+num2;System.out.println("兩個數(shù)的和是:"+result);}catch(ArithmeticExceptionex){System.out.println("對不起,不伺候!請錄入數(shù)字!");

ex.printStackTrace();}System.out.println("歡迎使用!");}}不正常情況:錄入:100和a輸出:異常堆棧段信息聲明的異常對象類型是ArithmeticException(算術(shù)異常)try-catch-finally塊在try/catch塊后加入finally塊,可以確保無論是否發(fā)生異常,finally塊中的代碼總能被執(zhí)行:try塊finally塊catch塊

無異常異常try-catch-finally塊try-catch-finally塊代碼示例:

publicclassAddition3{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù):");try{doublenum1=input.nextDouble();doublenum2=input.nextDouble();doubleresult=num1+num2;System.out.println("兩個數(shù)的和是:"+result);}catch(Exceptionex){System.out.println("對不起,不伺候!請錄入數(shù)字!");ex.printStackTrace();}finally{System.out.println("歡迎使用!");}}}finally代碼塊正常情況:錄入:100和200輸出:兩個數(shù)的和是:300歡迎使用!不正常情況:錄入:100和a輸出:對不起,不伺候!請錄入數(shù)字!歡迎使用!異常堆棧段信息課堂練習編寫類TestException,在main方法中使用try、catch、finally:在try塊中,編寫被0除的代碼在catch塊中,捕獲被0除所產(chǎn)生的異常,并且打印異常信息在finally塊中,打印“歡迎使用”演示:規(guī)范代碼多重catch塊一段代碼可能會產(chǎn)生多個異常系統(tǒng)運行時會依次對每個catch塊聲明的異常對象進行檢查,找到并執(zhí)行第一個與try語句塊拋出的異常類型匹配的catch塊代碼。其余的catch塊將被忽略。trycatch執(zhí)行catch后程序繼續(xù)正常運行異常

引發(fā)與異常類型1不符合

進入catchcatchcatch與異常類型2符合多重catch塊多重catch塊代碼示例:

publicclassDivision{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.println("請錄入兩個數(shù)");try{intnum1=input.nextInt();intnum2=input.nextInt();doubleresult=num1/num2;System.out.println("兩個數(shù)的商是:"

+result);}catch(InputMismatchExceptionex){System.out.println("對不起,不伺候!請錄入數(shù)字!");ex.printStackTrace();}catch(ArithmeticExceptionex){System.out.println("對不起,不伺候!除數(shù)不能為零!");ex.printStackTrace();}catch(Exceptionex){System.out.println("剩下的錯誤我都包了!");ex.printStackTrace();}finally{System.out.println("歡迎使用!");}}}最后一個catch的是Exception類的對象輸出:對不起,不伺候!請錄入數(shù)字!歡迎使用!異常堆棧段信息進入第一個catch塊錄入:100和a輸出:對不起,不伺候!除數(shù)不能為0!歡迎使用!異常堆棧段信息進入第二個catch塊錄入:100和0多重catch塊使用多重catch語句時,異常子類一定要位于異常父類之前

try{………}catch(Exceptionex){

………}catch(InputMismatchExceptionex){

………

}×異常處理的方式之二:拋出異常我們可以把當前無法解決的異常拋出,把異常交給調(diào)用者處理publicclassStudent{privateintage;//學員年齡,不能小于0publicintgetAge(){ returnage;}publicvoidsetAge(intage){

//判斷學員年齡是否小于0if(age>0){this.age=age;}else{

thrownewIllegalArgumentException("年齡必須大于零!);}}}throw關(guān)鍵字來手動拋出異常publicclassTestStudent{publicstaticvoidmain(String[]args){Studentstu=newStudent();try{stu.setAge(-100);}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}捕獲拋出的異常聲明異常在方法頭部使用throws來聲明這個方法可能會拋出的異常,這樣,調(diào)用者就會做出相應的處理。publicclassStudent{privateintage;//學員年齡,不能小于0publicintgetAge(){ returnage;}publicvoidsetAge(intage)throwsIllegalArgumentException{//判斷學員年齡是否小于0if(age>0){this.age=age;}else{

thrownewIllegalArgumentException("年齡必須大于零!");}}}throw關(guān)鍵字來手動拋出異常throws關(guān)鍵字來聲明這個方法可能會拋出的異常,可以有多個,中間用逗號隔開。publicclassTestStudent{publicstaticvoidmain(String[]args){Studentstu=newStudent();try{stu.setAge(-100);}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}捕獲拋出的異常課堂練習編寫類TestException1,實現(xiàn)如下需求:定義一個方法:aMethod()在該方法體內(nèi),拋出一個Exception對象,然后在該方法頭部聲明要拋出的異常在main()方法中,調(diào)用aMethod方法,使用try/catch捕獲aMethod方法中拋出的異常演示:規(guī)范代碼為什么需要包裝類intdigit=10;原始數(shù)據(jù)類型使用原始數(shù)據(jù)類型聲明的變量視為對象原始數(shù)據(jù)類型包裝類Java.lang包提供什么是包裝類下表列出了Java中8種原始數(shù)據(jù)類型對應的包裝類原始數(shù)據(jù)類型包裝類byte(字節(jié))Bytechar(字符)Characterint(整型)Integerlong(長整型)Longfloat(浮點型)Floatdouble(雙精度)Doubleboolean(布爾)Booleanshort(短整型)Short如何使用包裝類原始數(shù)據(jù)類型和包裝類之間的相互轉(zhuǎn)換示例代碼:publicclassWrapperTest{publicstaticvoidmain(String[]args){

//byte原始數(shù)據(jù)類型和對應包裝類之間相互轉(zhuǎn)換

bytebNum1=10;BytebNum=newByte(bNum1);System.out.println(bNum.byteValue());

//int原始數(shù)據(jù)類型和對應包裝類之間相互轉(zhuǎn)換

intiNum1=10;IntegeriNum=newInteger(iNum1);System.out.println(iNVal

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論