阜蒙縣建設(shè)小學(xué)校官方網(wǎng)站建e室內(nèi)設(shè)計(jì)網(wǎng)全景分類(lèi)
鶴壁市浩天電氣有限公司
2026/01/24 10:42:07
阜蒙縣建設(shè)小學(xué)校官方網(wǎng)站,建e室內(nèi)設(shè)計(jì)網(wǎng)全景分類(lèi),wordpress中l(wèi)ogo大小,北極寒流wordpress異常
異常(Exception)
1. 概念
異常是程序執(zhí)行期間發(fā)生的事件#xff0c;該事件中斷了程序指令的正常流程。
當(dāng)方法內(nèi)發(fā)生錯(cuò)誤時(shí)#xff0c;該方法創(chuàng)建一個(gè)對(duì)象并將其交給運(yùn)行系統(tǒng)。該對(duì)象稱為異常對(duì)象。包含有關(guān)的錯(cuò)誤信息#xff0c;包含錯(cuò)誤的類(lèi)型和發(fā)生錯(cuò)誤時(shí)程序的…異常異常(Exception)1. 概念異常是程序執(zhí)行期間發(fā)生的事件該事件中斷了程序指令的正常流程。當(dāng)方法內(nèi)發(fā)生錯(cuò)誤時(shí)該方法創(chuàng)建一個(gè)對(duì)象并將其交給運(yùn)行系統(tǒng)。該對(duì)象稱為異常對(duì)象。包含有關(guān)的錯(cuò)誤信息包含錯(cuò)誤的類(lèi)型和發(fā)生錯(cuò)誤時(shí)程序的狀態(tài)。創(chuàng)建異常對(duì)象并將其交給運(yùn)行時(shí)系統(tǒng)稱為拋出異常異常是由方法拋出運(yùn)行時(shí)異常運(yùn)行時(shí)異常是只有執(zhí)行程序才可以見(jiàn)檢測(cè)出來(lái)運(yùn)行時(shí)異常示例publicclassExample1{publicstaticvoidmain(String[]args){calculate();}publicstaticvoidcalculate(){intresult1/0;//該行代碼不能被執(zhí)行因?yàn)榘l(fā)生了異常System.out.println(result);}}異常信息 Exception in thread main java.lang.ArithmeticException: / by zero at com.Sonnet.example.Example1.calculate(Example1.java:10) at com.Sonnet.example.Example1.main(Example1.java:6) 異常的類(lèi)型java.lang.ArithmeticException ---算數(shù)異常 異常的信息/ by zero --- / 0 程序的狀態(tài)at com.Sonnet.example.Example1.calculate(Example1.java:10) at com.Sonnet.example.Example1.main(Example1.java:6) 因?yàn)榘l(fā)生了異常終止了程序的正常執(zhí)行流程所以不會(huì)打印檢測(cè)異常檢測(cè)異常是不運(yùn)行編譯器就可以報(bào)錯(cuò)會(huì)有紅色波浪線提示檢測(cè)異常示例//會(huì)有紅色的波浪線正確應(yīng)該是 float f 1.0ffloatf1.0;2. 異常體系ThrowablpublicStringgetMessage();//獲取異常發(fā)生的原因publicvoidprintStackTrance();//打印異常在棧中的軌跡ErrorError是一種非常嚴(yán)重的錯(cuò)誤程序員不能通過(guò)編碼解決。ExceptionException表示是異常的意思主要是程序員在編寫(xiě)代碼時(shí)考慮不周的問(wèn)題。異常分為運(yùn)行時(shí)異常和檢查異常一旦程序出現(xiàn)這些異常程序員應(yīng)該處理這些異常RuntimeExceptionRuntimeException表示運(yùn)行時(shí)異常所有在程序運(yùn)行時(shí)檢測(cè)拋出的異常類(lèi)型都屬于RuntimeException的子類(lèi)。運(yùn)行時(shí)異常一般來(lái)說(shuō)程序可以自動(dòng)恢復(fù)不必處理。檢查異常檢查異常是指編譯器在編譯代碼的過(guò)程中發(fā)現(xiàn)不正確的代碼拋出的異常異常處理1. 如何處理異常在Java中異常的種類(lèi)很多如果每一種異常類(lèi)型我們都需要記住這無(wú)疑是一件很困難的事情如果有一套機(jī)制來(lái)處理異常。那么將減少程序員在開(kāi)發(fā)的耗時(shí)。Java就提供了一套異常處理機(jī)制來(lái)處理異常。Java提供了5個(gè)關(guān)鍵字throw、throws、try、catch、finally2. throw拋出異常throw關(guān)鍵字只能在方法內(nèi)部使用throw關(guān)鍵字拋出異常表示自身并對(duì)異常進(jìn)行處理語(yǔ)法throw異常對(duì)象;//通常與if選擇結(jié)構(gòu)配合使用示例staticScannerscnewScanner(System.in);publicstaticvoidmain(String[]args){calculate();}publicstaticvoidcalculate(){System.out.println(請(qǐng)輸入一個(gè)數(shù)字);intnumber1sc.nextInt();System.out.println(請(qǐng)?jiān)佥斎胍粋€(gè)數(shù)字);intnumber2sc.nextInt();//如果除數(shù)為0拋出異常if(number20){//ArithmeticException算術(shù)異常thrownewArithmeticException(在除法運(yùn)算中除數(shù)不能為0);//這么寫(xiě)也可以// ArithmeticException e new ArithmeticException(在除法運(yùn)算中除數(shù)不能為0);// throw e;}intresultnumber1/number2;System.out.println(result);}}異常信息 請(qǐng)輸入一個(gè)數(shù)字 10 請(qǐng)?jiān)佥斎胍粋€(gè)數(shù)字 0 Exception in thread main java.lang.ArithmeticException: 在除法運(yùn)算中除數(shù)不能為0 at com.Sonnet.example.Example1.calculate(Example1.java:19) at com.Sonnet.example.Example1.main(Example1.java:10) Process finished with exit code 13. throws聲明可能拋出的異常類(lèi)型throws關(guān)鍵字只能應(yīng)用在方法或者構(gòu)造方法的定義對(duì)可能拋出的異常類(lèi)型進(jìn)行聲明自身不會(huì)對(duì)異常進(jìn)行處理由方法的調(diào)用者來(lái)處理。如果方法的調(diào)用者未處理則異常持續(xù)向上一級(jí)拋出直至main方法為止如果main方法也未處理那么程序可能因此終止語(yǔ)法訪問(wèn)修飾符 返回值類(lèi)型 方法名參數(shù)列表throws異常類(lèi)型1 異常類(lèi)型2···{}示例publicclassExample2{privatestaticScannerscnewScanner(System.in);publicstaticvoidmain(String[]args){intnumbergetNumber();System.out.println(number);}//執(zhí)行該方法可能會(huì)拋出InputMismatchException---輸入不匹配異常publicstaticintgetNumber()throwsInputMismatchException{System.out.println(請(qǐng)輸入一個(gè)數(shù)字);intnumbersc.nextInt();returnnumber;}}throws可以聲明方法執(zhí)行時(shí)可能拋出的異常類(lèi)型但需要注意的是方法執(zhí)行過(guò)程中只能拋出一個(gè)異常4. try-catch異常throw和throws關(guān)鍵字均沒(méi)有對(duì)異常進(jìn)行處理這可能導(dǎo)致程序終止。這種情況下可以使用try-catch結(jié)構(gòu)來(lái)對(duì)拋出異常進(jìn)行捕獲處理從而保證程序能夠正常運(yùn)行語(yǔ)法try{//代碼塊}catch(異常類(lèi)型 異常對(duì)象名){}其中try表示嘗試的意思嘗試執(zhí)行try結(jié)構(gòu)中的代碼塊如果允許過(guò)程中拋出了異常則交給catch語(yǔ)句進(jìn)行操作示例publicclassExample3{privatestaticScannerscnewScanner(System.in);publicstaticvoidmain(String[]args){//嘗試執(zhí)行try中的代碼發(fā)生異常將其抓住try{intnumbersc.nextInt();}catch(InputMismatchExceptione){System.out.println(請(qǐng)不要瞎寫(xiě)只能輸入數(shù)字);}System.out.println(發(fā)生異常也會(huì)執(zhí)行);}}a 請(qǐng)不要瞎寫(xiě)只能輸入數(shù)字 發(fā)生異常也會(huì)執(zhí)行即便發(fā)生了異常依舊會(huì)繼續(xù)執(zhí)行之后的代碼那么如何知道異常出現(xiàn)在哪里可以通過(guò)printStackTrance()打印異常軌跡和getMessage();獲取異常信息來(lái)確定示例publicstaticvoidmain(String[]args){try{intnumbersc.nextInt();System.out.println(number);}catch(InputMismatchExceptione){//打印異常軌跡e.printStackTrace();System.out.println(e.getClass().getName());System.out.println(異常信息e.getMessage());System.out.println(請(qǐng)不要瞎寫(xiě)只能輸入數(shù)字);}System.out.println(發(fā)生異常也會(huì)執(zhí)行);}}a java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at com.Sonnet.example.Example3.main(Example3.java:12) java.util.InputMismatchException 異常信息null 請(qǐng)不要瞎寫(xiě)只能輸入數(shù)字 發(fā)生異常也會(huì)執(zhí)行思考如果一個(gè)方法可能拋出多個(gè)異常如何捕獲可以在try后面添加多個(gè)catch字句來(lái)分別對(duì)每一種異常進(jìn)行處理—多分支catch示例publicclassExample3{privatestaticScannerscnewScanner(System.in);publicstaticvoidmain(String[]args){intnumdivide();System.out.println(num);}publicstaticintdivide()throwsInputMismatchException,ArithmeticException{try{intnumber1getNumber();intnumber2getNumber();returnnumber1/number2;}catch(InputMismatchExceptione){System.out.println(請(qǐng)不要亂輸入只能輸入數(shù)字);}catch(ArithmeticExceptione){System.out.println(除法運(yùn)算中0不能當(dāng)除數(shù));}return0;}publicstaticintgetNumber()throwsInputMismatchException{System.out.println(請(qǐng)輸入一個(gè)數(shù)字);intnumbersc.nextInt();returnnumber;}}請(qǐng)輸入一個(gè)數(shù)字 a 請(qǐng)不要亂輸入只能輸入數(shù)字 0請(qǐng)輸入一個(gè)數(shù)字 1 請(qǐng)輸入一個(gè)數(shù)字 0 除法運(yùn)算中0不能當(dāng)除數(shù) 0throw 拋出 throws 聲明 try-catch處理5. finally語(yǔ)句finally語(yǔ)句不能單獨(dú)存在必須與try語(yǔ)句或者try-catch結(jié)構(gòu)配合使用表示無(wú)論程序是否發(fā)生異常都會(huì)執(zhí)行主要用于釋放資源。但如果try語(yǔ)句或者catch語(yǔ)句存在系統(tǒng)退出的代碼則finally語(yǔ)句將得不到執(zhí)行。System.exit(0);//0: 系統(tǒng)正常退出System.exit(1);//非0: 系統(tǒng)非正常退出語(yǔ)法try{}finally{}//或者try{}catch(異常類(lèi)型 異常對(duì)象名){}finally{}示例一publicclassExample4{privatestaticint[]numbers{1,2,3,4,5};publicstaticvoidmain(String[]args){try{//數(shù)組越界intnumbergetNumberArray(10);System.out.println(number);}finally{System.out.println(需要執(zhí)行的代碼);}}publicstaticintgetNumberArray(intindex){returnnumbers[index];}}需要執(zhí)行的代碼 Exception in thread main java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at com.Sonnet.example.Example4.getNumberArray(Example4.java:17) at com.Sonnet.example.Example4.main(Example4.java:9)示例二系統(tǒng)退出publicclassExample4{privatestaticint[]numbers{1,2,3,4,5};publicstaticvoidmain(String[]args){try{//系統(tǒng)正常退出如果非0那么是異常退出System.exit(0);//數(shù)組越界intnumbergetNumberArray(10);System.out.println(number);}finally{System.out.println(需要執(zhí)行的代碼);}}publicstaticintgetNumberArray(intindex){returnnumbers[index];}}什么都沒(méi)有輸出因?yàn)橥顺隽讼到y(tǒng)但是改變System.exit(0)會(huì)有不同效果示例三先拋出異常在系統(tǒng)退出publicclassExample4{privatestaticint[]numbers{1,2,3,4,5};publicstaticvoidmain(String[]args){try{//先拋出異常在退出//數(shù)組越界intnumbergetNumberArray(10);System.out.println(number);//系統(tǒng)正常退出如果非0那么是異常退出System.exit(0);}finally{System.out.println(需要執(zhí)行的代碼);}}publicstaticintgetNumberArray(intindex){returnnumbers[index];}}需要執(zhí)行的代碼 Exception in thread main java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5 at com.Sonnet.example.Example4.getNumberArray(Example4.java:20) at com.Sonnet.example.Example4.main(Example4.java:10)發(fā)現(xiàn) 需要執(zhí)行的代碼 被輸出了說(shuō)明并沒(méi)有退出系統(tǒng)因?yàn)樵趻伋隽水惓V缶烷_(kāi)始執(zhí)行finally語(yǔ)句了soutnumber和退出系統(tǒng)并沒(méi)有執(zhí)行示例四publicclassExample4{privatestaticint[]numbers{1,2,3,4,5};publicstaticvoidmain(String[]args){try{//數(shù)組越界intnumbergetNumberArray(10);System.out.println(number);//系統(tǒng)正常退出如果非0那么是異常退出System.exit(0);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(數(shù)組下標(biāo)越界了);}finally{System.out.println(需要執(zhí)行的代碼);}}publicstaticintgetNumberArray(intindex){returnnumbers[index];}}數(shù)組下標(biāo)越界了 需要執(zhí)行的代碼如果在catch語(yǔ)句中添加系統(tǒng)退出那么finally語(yǔ)句就不會(huì)執(zhí)行了面試題分析如下代碼的執(zhí)行結(jié)構(gòu)publicclassExample5{publicstaticvoidmain(String[]args){intresultgetResult();System.out.println(result);}publicstaticintgetResult(){intnumber10;try{returnnumber;}catch(Exceptione){return1;}finally{number;}}}運(yùn)行結(jié)果為10try是嘗試執(zhí)行嘗試返回所以嘗試返回一個(gè)結(jié)果但發(fā)現(xiàn)后面還有一個(gè)finally模塊而finally模塊一定會(huì)執(zhí)行。于是在這里只能將返回值用一個(gè)臨時(shí)變量例如變量a存儲(chǔ)起來(lái)。然后再執(zhí)行finally模塊再將這個(gè)臨時(shí)變量a存儲(chǔ)起來(lái)的值返回。但number是將number 1和臨時(shí)變量a沒(méi)有關(guān)系。如果finally模塊是 return number那么得到的result就是11自定義異常1. 為什么要使用自定義異常再Java中異常的類(lèi)型非常多要想使用這些異常首先必須熟悉它們。這無(wú)疑是一個(gè)巨大的工作很耗費(fèi)時(shí)間。如果我們可以自定義異常則只需要熟悉RuntimeExceptiom、Exception、Throwable即可。這大大縮小了范圍自定義異常還可以幫助我們快速定位問(wèn)題。自定義運(yùn)行時(shí)異常語(yǔ)法publicclass類(lèi)名extendsRuntimeException{}自定義檢查異常語(yǔ)法publicclass類(lèi)名extendsException{}示例在登錄時(shí)經(jīng)常會(huì)看到用戶名提示不存在或者賬號(hào)密碼錯(cuò)誤。請(qǐng)用自定義異常來(lái)描述publicclassExample6{privatestaticScannerscnewScanner(System.in);publicstaticvoidmain(String[]args){System.out.println(請(qǐng)輸入賬號(hào));Stringusernamesc.next();System.out.println(請(qǐng)輸入密碼);Stringpasswordsc.next();//檢查異常必須要做處理try{login(username,password);}catch(UsernameNoFoundExceptione){e.printStackTrace();}catch(BadCredentialExceptione){e.printStackTrace();}}publicstaticvoidlogin(Stringusername,Stringpassword)throwsUsernameNoFoundException,BadCredentialException{if(admin.equals(username)){if(123456.equals(password)){System.out.println(登錄成功);}else{thrownewBadCredentialException(賬號(hào)或密碼錯(cuò)誤);}}else{thrownewUsernameNoFoundException(賬號(hào)不存在);}}}請(qǐng)輸入賬號(hào) admin 請(qǐng)輸入密碼 123456 登錄成功請(qǐng)輸入賬號(hào) jiayi 請(qǐng)輸入密碼 123 com.Sonnet.example.UsernameNoFoundException: 賬號(hào)不存在 at com.Sonnet.example.Example6.login(Example6.java:33) at com.Sonnet.example.Example6.main(Example6.java:17)請(qǐng)輸入賬號(hào) admin 請(qǐng)輸入密碼 123 com.Sonnet.example.BadCredentialException: 賬號(hào)或密碼錯(cuò)誤 at com.Sonnet.example.Example6.login(Example6.java:30) at com.Sonnet.example.Example6.main(Example6.java:17)2. 異常使用注意事項(xiàng)重要運(yùn)行時(shí)異??梢圆蛔鎏幚韕ublicclassExample7{publicstaticvoidmain(String[]args){int[]arr{1,2,3,4,5,6};//并沒(méi)有報(bào)錯(cuò)System.out.println(arr[6]);}}如果父類(lèi)拋出了多個(gè)異常子類(lèi)覆蓋父類(lèi)方法時(shí)只能拋出相同的異常或者是該類(lèi)的子集。與協(xié)變返回類(lèi)型原理一致示例publicclassfather{//父類(lèi)聲明拋出了異常publicvoideat()throwsException{}}publicclasschildextendsfather{//必須要重寫(xiě)方法并且同的異?;蛘呤窃擃?lèi)的子集//可以拋出Exception或者RuntimeException等//但不能拋出父類(lèi)ThrowableOverridepublicvoideat()throwsException{super.eat();}}父類(lèi)方法沒(méi)有拋出子集子類(lèi)覆蓋父類(lèi)該方法時(shí)也不可拋出檢查異常。此時(shí)子類(lèi)產(chǎn)生該異常只能捕獲處理不能聲明拋出。示例publicclassfather{publicvoideat()throwsException{}//父類(lèi)沒(méi)有聲明拋出異常publicvoidsleep(){}publicvoidlogin(){}}publicclasschildextendsfather{Stringusername;Stringpassword;publicchild(Stringusername,Stringpassword){this.usernameusername;this.passwordpassword;}//必須要重寫(xiě)方法并且同的異常或者是該類(lèi)的子集//可以拋出Exception或者RuntimeException等//但不能拋出父類(lèi)ThrowableOverridepublicvoideat()throwsException{super.eat();}//父類(lèi)沒(méi)有聲明拋出異常//此時(shí)子類(lèi)只能聲明拋出運(yùn)行時(shí)異常//不能拋出檢查異常Overridepublicvoidsleep()throwsRuntimeException{}//父類(lèi)中的方法沒(méi)有聲明拋出異常子類(lèi)中方法不能聲明拋出檢查異常//只能捕獲處理Overridepublicvoidlogin(){try{Example6.login(username,password);}catch(UsernameNoFoundExceptione){thrownewRuntimeException(e);}catch(BadCredentialExceptione){thrownewRuntimeException(e);}}}要重寫(xiě)方法并且同的異?;蛘呤窃擃?lèi)的子集//可以拋出Exception或者RuntimeException等//但不能拋出父類(lèi)ThrowableOverridepublic void eat() throws Exception {super.eat();}//父類(lèi)沒(méi)有聲明拋出異常 //此時(shí)子類(lèi)只能聲明拋出運(yùn)行時(shí)異常 //不能拋出檢查異常 Override public void sleep() throws RuntimeException{ } //父類(lèi)中的方法沒(méi)有聲明拋出異常子類(lèi)中方法不能聲明拋出檢查異常 //只能捕獲處理 Override public void login() { try { Example6.login(username, password); } catch (UsernameNoFoundException e) { throw new RuntimeException(e); } catch (BadCredentialException e) { throw new RuntimeException(e); } } }