版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
7異常7.1異常機制7.2異常處理7.3異常分類7.4異常拋出7.5自定義異常類7.1異常機制異常機制是指當(dāng)程序出現(xiàn)錯誤后,程序如何處理。異常處理就是在異常引發(fā)后,應(yīng)用程序能夠轉(zhuǎn)移到一個安全狀態(tài),使得系統(tǒng)能夠恢復(fù)控制權(quán)或降級運行或正常結(jié)束程序運行,不至于使系統(tǒng)崩潰或死機,并且盡可能地保存數(shù)據(jù)、避免損失。Java程序示例-沒有異常處理publicclasstest{publicstaticvoidmain(Stringargs[]){inti=0;
String[]greetings={"Helloworld!","No,Imeanit!","HELLOWORLD!!"};while(i<4){System.out.println(greetings[i]);i++;}
System.out.println("處理完畢");}}程序運行結(jié)果:Helloworld!No,Imeanit!HELLOWORLD!!Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3 attest.main(test.java:9)程序出現(xiàn)異常崩潰(自動終止)并輸出錯誤信息其后正常代碼無法繼續(xù)異常處理方式之一…while(i<4){
System.out.println(greetings[i]);i++;}
System.out.println("處理完畢");…if(i>=greetings.length)break;缺陷:異常處理代碼與正常執(zhí)行的代碼混在一起,可讀性降低。由正常程序來分析錯誤,這就要求程序員對可能出現(xiàn)的異常要有很深的了解和解決方案等。
傳統(tǒng)處理異常示例…intcheckScore(doubles){if(s<0||s>100)return-1;elsereturn1;}…voidinputScore(){do{輸入成績s;if(checkScore(s)==-1)請輸入0-100的成績;else{有效數(shù)據(jù);break;}while(1)
…}一些缺陷:如果函數(shù)確實要返回-1這個正確的值時就會出現(xiàn)混淆;可讀性降低,將程序代碼與處理異常的代碼混在一起;由調(diào)用函數(shù)的程序來分析錯誤,這就要求客戶程序員對庫函數(shù)有很深的了解等。
Java處理異?!瓀hile(i<4){
i++;}System.out.println("處理完畢");…System.out.println(greetings[i]);//可能有異常的語句try{
}catch(Exceptione){ System.out.println("有異常!");//異常處理}//endtry...catch程序運行結(jié)果:Helloworld!No,Imeanit!HELLOWORLD!!有異常!處理完畢可見:Java異常處理允許程序捕獲異常,并處理它們,然后繼續(xù)程序執(zhí)行,錯誤情況不會介入到程序的正常流程中。異常處理代碼與正常執(zhí)行的代碼分離,更易識別和管理。
…while(i<4){
System.out.println(greetings[i]);
i++;}System.out.println("處理完畢");…try{
}catch(){
}
//endtry...catch更詳盡的異常處理ArrayIndexOutOfBoundsExceptioneSystem.out.println("數(shù)組下標(biāo)越界啰!");//異常處理【Return】7.2異常處理Java異常處理涉及五個關(guān)鍵字: try、catch、finally throws、throw(這兩個見7.4節(jié))try和catch語句用法:try{//可能會產(chǎn)生異常的代碼}catch(某個異常類型異常變量名){//某個特定類型的異常處理代碼
//即使catch塊是空的,也算是處理情況}注意:一個try塊可能有多個catch塊,每一catch塊可處理不同的異常。通用異常處理方法;catch(Exceptione){}
多個catch塊示例
…while(i<4){ try{
System.out.println(greetings[i]);
intk=Integer.parseInt("a");
//增加一條語句
}
catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("數(shù)組下標(biāo)越界異常處理塊");}
catch(NumberFormatExceptione){ System.out.println("數(shù)據(jù)格式不正確");
}i++;}…匹配原則:由上到下只匹配其中一個異常類,而不會再執(zhí)行別的catch塊。
運行結(jié)果:Helloworld!數(shù)據(jù)格式不正確No,Imeanit!數(shù)據(jù)格式不正確HELLOWORLD!!數(shù)據(jù)格式不正確數(shù)組下標(biāo)越界異常處理塊finally語句finally語句定義一個總是要執(zhí)行的代碼塊,而不考慮異常是否被捕獲。一般用法:try{…}catch(異常類型異常變量名){//某個特定類型的異常處理代碼}finally{//不管是否有異常發(fā)生,這里代碼都要執(zhí)行}示例publicclasstest{publicstaticvoidmain(Stringargs[]){ intk;
try
{
k=Integer.parseInt("12.3");
}
catch(Exceptione){
System.out.println("數(shù)據(jù)轉(zhuǎn)換出錯了!");
}
finally
{
k=0;
System.out.println("一定要執(zhí)行的塊");
}System.out.print("k="+k);}}運行結(jié)果:數(shù)據(jù)轉(zhuǎn)換出錯了!一定要執(zhí)行的塊k=0能放到這兒嗎?注意try、catch、finally三個語句塊均不能單獨使用,三者可以組成try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語句可以有一個或多個,finally語句最多一個。try、catch、finally三個代碼塊中變量的作用域為代碼塊內(nèi)部,分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。(如前例的intk變量)【Return】關(guān)于getMessage()和printStackTrace()例如某個異常信息:java.lang.NumberFormatException:Forinputstring:"a"
atjava.lang.NumberFormatException.forInputString(NumberFormatException.java:48)atjava.lang.Integer.parseInt(Integer.java:447)atjava.lang.Integer.parseInt(Integer.java:497)attest.main(test.java:15)e.getMessage()得到錯誤信息e.printStackTrace()輸出詳細的錯誤信息【Return】try
{
int
k=Integer.parseInt("a");
}catch(Exceptione){
e.printStackTrace();
System.out.println(
e.getMessage());}7.3異常分類Java異常類分為兩大類,錯誤類Error和異常類Exception。
(見后圖)java.lang.Throwable作為所有異常的超類。Error是程序無法處理的錯誤,這些異常發(fā)生時,JVM一般會選擇線程終止。
Exception是程序本身可以處理的異常,應(yīng)當(dāng)盡可能去處理。
RuntimeException:運行時異常,程序可以選擇處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應(yīng)該盡可能避免這類異常的發(fā)生。
RuntimeException以外的異常:非運行時異常,是必須進行處理的異常,如果不處理,程序就不能編譯通過。常見的異常集Exception異常類的根異常。(這就是為什么通用異常處理采用它)ArithmeticException算術(shù)異常。如除零。ArrayIndexOutOfBoundsException數(shù)組索引越界異常。當(dāng)對數(shù)組的索引值為負數(shù)或大于等于數(shù)組大小時拋出。ClassCastException強制類型轉(zhuǎn)換異常。
如:A不是B的父類或子類,Aa=newA();Bb=(b)a;NullPointerException空指針異常。如:Aa;輸出a.toString()NumberFormatException數(shù)字格式異常。如:
intInteger.parseInt("12.34");【Return】7.4異常拋出importjava.io.*;importjava.sql.*;publicclasstest{publicstaticvoidmain(String[]args){try{Stringurl="jdbc:mysql://localhost:3306/school";//數(shù)據(jù)庫連接字符串Class.forName("org.gjt.mm.mysql.Driver").newInstance();//加載驅(qū)動程序Connectionconn=DriverManager.getConnection(url,"root","dba");//建立連接Statementstmt=conn.createStatement();//創(chuàng)建SQL容器Stringsql="select*fromteacher";//表為teacherResultSetrs=stmt.executeQuery(sql);//獲得結(jié)果集while(rs.next()){//處理結(jié)果集System.out.print(rs.getString("id")+"");System.out.print(rs.getString("name")+"");System.out.print(rs.getString("address")+"");System.out.print(rs.getString("year")+"\n");
}
rs.close();stmt.close();conn.close();//依次關(guān)閉}catch(Exceptione){e.printStackTrace();}}}引例輸出詳細的錯誤信息非RuntimeException異常,是必須進行處理的異常,如果不處理,程序就不能編譯通過。從前面例子可以看出有時默認(rèn)的錯誤信息通常晦澀難懂,很難解釋程序在何處出了何種問題。為了使程序更加健壯,對于有些異常是當(dāng)前層不能解決的,則可拋出異常(以后由上層來處理)。改進一下importjava.io.*;importjava.sql.*;publicclasstest{publicstaticvoidmain(String[]args)throwsException{Stringurl="jdbc:mysql://localhost:3306/school";//數(shù)據(jù)庫連接字符串Class.forName("org.gjt.mm.mysql.Driver").newInstance();//加載驅(qū)動程序Connectionconn=DriverManager.getConnection(url,"root","dba");//建立連接Statementstmt=conn.createStatement();//創(chuàng)建SQL容器Stringsql="select*fromteacher";//表為teacherResultSetrs=stmt.executeQuery(sql);//獲得結(jié)果集while(rs.next()){//處理結(jié)果集System.out.print(rs.getString("id")+"");System.out.print(rs.getString("name")+"");System.out.print(rs.getString("address")+"");System.out.print(rs.getString("year")+"\n");
}
rs.close();stmt.close();conn.close();//關(guān)閉次序}}當(dāng)前方法不處理異常,向上層拋出throws關(guān)鍵字throws關(guān)鍵字:出現(xiàn)在方法的聲明中,表示該方法可能會拋出的異常允許throws后面跟著多個異常類型。throws用法:方法聲明[throws<異常類>]{方法實現(xiàn)…} 其中:異常類可以聲明多個,用逗號分割。throw關(guān)鍵字throw關(guān)鍵字:throw出現(xiàn)在方法體中,用于拋出一個具體的異常對象。throw用法:if(異常條件)throw<異常對象>;try{…}catch{throw<異常對象>;}注意:throws可以單獨使用,但throw不能。throw要么和try-catch-finally語句配套使用,要么與throws配套使用。
與throws搭配throws和throw編程示例publicclasstest{publicstaticvoidmain(String[]args){try{ System.out.println(Math.sqrt(-144));}catch(Exceptione){System.out.println("根號下不能負數(shù)");}}}
運行結(jié)果:NaN發(fā)現(xiàn)無法捕捉異常改進:自定義一個MyMath.sqrt()方法來改進Math.sqrt()方法,并對異常進行重新封裝。引例自定義MyMath.sqrt()來改進Math.sqrt(),并對異常進行重新封裝classMyMath{publicstaticdoublesqrt(StringnStr)
throwsException{
//throws出現(xiàn)在方法聲明中
if(nStr==null){
//throw出現(xiàn)在方法體中,用于拋出一個具體的異常對象
throw
newException("輸入的字符不能為空!");
}doublen=0;try{n=Double.parseDouble(nStr);}
catch(NumberFormatExceptione){ thrownewException("輸入的字符串必須能夠轉(zhuǎn)化成數(shù)字!");}if(n<0){
throw
newException("輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!");}
returnMath.sqrt(n);
}
}當(dāng)異常被拋出時程序會跳出方法拋出一個自定義信息的異常異常重新封裝測試代碼publicstaticvoidmain(String[]args){
booleanf=true;while(f){
try{ System.out.print("請輸入值:"); Strings=newScanner(System.in).nextLine();System.out.println(MyMath.sqrt(s));
f=false;
}catch(Exceptione){
System.out.println(e.getMessage());
f=true;}}}【Return】獲得異常的錯誤信息輸入數(shù)據(jù)直至輸入非負數(shù)為止7.5自定義異常類用戶自定義異常類是通過擴展Exception類來創(chuàng)建的。這種異常類可以包含一個“普通”類所包含的任何東西。示例classMyException1extendsException{//自定義異常類Stringmsg=null;publicMyException1(Stringm){this.msg=m;}publicStringtoString(){return"拋出自定義異常:"+msg;}}publicclasstest{publicstaticvoidmain(String[]args){inti=10;
try{if(i<100){
thrownewMyException1("輸入值小于100");//拋出異常}
}catch(MyException1ex){System.out.println(ex);//會調(diào)用ex.toString()方法
}}}運行結(jié)果:拋出自定義異常:輸入值小于100示例|處理本章首例classMyException1extends
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 檢察文檔管理數(shù)字化資料
- 第二屆全國小動物臨床技能大賽參考試題庫(含答案)
- 《網(wǎng)絡(luò)安全法》知識考試題庫300題(含答案)
- 2025年新疆交通職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 專題06 語法填空 解題技巧
- 2025年春季學(xué)期學(xué)校德育工作計劃安排表(完整版)
- 實驗室的租賃合同
- 范文汽車場地租賃合同
- 搭建冷庫及對設(shè)備的銷售安裝合同
- 建筑服務(wù)勞務(wù)合同范本
- 2025年有機肥行業(yè)發(fā)展趨勢分析報告
- 2023-2024年員工三級安全培訓(xùn)考試題及參考答案(綜合題)
- 對口升學(xué)語文模擬試卷(6)-江西?。ń馕霭妫?/a>
- 2025保安部年度工作計劃
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫
- 招標(biāo)采購基礎(chǔ)知識培訓(xùn)
- 電力系統(tǒng)分布式模型預(yù)測控制方法綜述與展望
- 2024年注冊建筑師-二級注冊建筑師考試近5年真題附答案
- 五年級口算題卡每天100題帶答案
- 2024年貴州省中考理科綜合試卷(含答案)
- 無人機技術(shù)與遙感
評論
0/150
提交評論