第6章 異常處理_第1頁
第6章 異常處理_第2頁
第6章 異常處理_第3頁
第6章 異常處理_第4頁
第6章 異常處理_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章內部類和異常類Java面向對象程序設計一些奇怪的類Java語言程序設計內部類一個類中聲明另一個類,這樣的類稱作內部類,而包含內部類的類成為內部類的外嵌類。Java語言程序設計publicclassChina{finalStringsong="義勇軍進行曲";privateBeijingbeijing;//內部類聲明的對象,作為外嵌類的成員

China(){

beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}classBeijing{//內部類的聲明

Stringname="北京";voidspeak(){System.out.printf("%s\n%s","我們是"+name,"我們的國歌是:"+getSong());}}}Java語言程序設計內部類小結外嵌類的成員變量在內部類中仍然有效內部類可以調用外嵌類的方法外嵌類的類體中可以使用內部類來聲明變量反之則不可以Java語言程序設計匿名類情形1:子類去掉類聲明情形2:直接用接口名和類體創(chuàng)建Java語言程序設計abstractclassSpeak{publicabstractvoidspeakHello();}classStudent{voidf(Speaksp){sp.speakHello();}}publicclassExample6_2{publicstaticvoidmain(Stringargs[]){Speakspeak=newSpeak(){publicvoidspeakHello(){System.out.println("大家好,祝工作順利!");}};speak.speakHello();Studentst=newStudent();st.f(newSpeak(){publicvoidspeakHello(){System.out.println("Iamastudent,howareyou");}});}}Java語言程序設計interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);System.out.println("result="+result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Cubiccu=newCubic(){publicdoublegetCubic(doublex){returnx*x*x;}};doublem=cu.getCubic(5);//接口回調

System.out.println("m="+m);Aa=newA();a.f(newCubic(){publicdoublegetCubic(doublex){returnx*x*x;}});}}Java語言程序設計匿名類小結匿名類無名可用,因此不能用匿名類聲明對象匿名類一定是內部類,因此可以訪問外嵌類的成員變量和方法Java語言程序設計Class類是java.lang包里的一個類,實例用來封裝對象運行時的狀態(tài)Java語言程序設計publicclassRect{doublewidth,height,area;publicdoublegetArea(){area=height*width;returnarea;}}importjava.lang.reflect.*;publicclassExample6_7{publicstaticvoidmain(Stringargs[]){Rectrect=newRect();Classcs=rect.getClass();StringclassName=cs.getName();Constructor[]con=cs.getDeclaredConstructors();Field[]field=cs.getDeclaredFields();Method[]method=cs.getDeclaredMethods();System.out.println("類的名字:"+className);System.out.println("類中有如下的成員變量:");

for(inti=0;i<field.length;i++){System.out.println(field[i].toString());}System.out.println("類中有如下的方法:");

for(inti=0;i<method.length;i++){System.out.println(method[i].toString());}System.out.println("類中有如下的構造方法:");

for(inti=0;i<con.length;i++){System.out.println(con[i].toString());}}}Java語言程序設計Class類小結不能用new來創(chuàng)建,只能用對象的.getClass()方法獲取Class類的對象getName()返回類的名字getDeclaredConstructors()返回類的全部構造方法getDeclaredFields()返回類的全部成員變量cs.getDeclaredMethods()返回類的全部方法可用來生成一個類的實例,如Classcs=Class.forName("Circle");Circlecircle=(Circle)cs.newInstance();下面學習異常處理機制,包括異常類。Java語言程序設計13勤奮的倒霉事件薄之一窺我讓用戶輸入兩個數(shù)相除,可他竟然輸入了兩個0給我,暈!我去打開文件,可是發(fā)現(xiàn)本該存在的文件不知道被哪個家伙給刪掉了,倒霉!文件倒是沒有被刪掉,可以打不開。難道是被別的程序正在以獨享的方式打開著?我又不是別人肚子里的蛔蟲,我怎么知道別的程序在干什么。窩火!我去連接數(shù)據(jù)庫,可連不上。鬼知道數(shù)據(jù)庫那邊出什么事了。數(shù)據(jù)庫那邊不是我的地盤了。無奈!14倒霉的事情總會發(fā)生!!!無論你多有天分,也不能保證倒霉的事情一定不會發(fā)生。你需要處理異常狀況的程序。我怎么知道會出現(xiàn)哪些異常狀況?聽程序員勤奮說,異常處理的代碼寫起來好費事,沒自信!如果你跟勤奮學習如何進行異常處理,那準備好1個月時間吧,也許你還不能學好。跟家明學習,1天應該夠了吧。而且還學得像模像樣的。15聽聽Java講解什么是異常記者您好。聽說您在異常處理方面取得了巨大的成就。Java是的,不謙虛地說,可以說是劃時代的進步。記者那您簡單介紹一下什么是異常嗎?Java異常就是在程序的運行過程中所發(fā)生的意外事件,它中斷指令的正常執(zhí)行。比如:打開文件;打不開咋辦?判斷大小;大小判斷失敗怎么辦?(磁帶)分配內存;內存不夠讀入內存;文件讀不出來關掉文件;文件關不掉。16記者哦。那如果發(fā)生這樣的不幸,程序又能怎么辦呢?Java對于一個沒有做異常處理的程序來說,你會看到一些莫名奇妙的東西,程序也死掉了。記者這樣感覺程序好像很不負責任似的。用戶還不知道發(fā)生了什么事情,它就自己一死了之。Java不錯。如果做了異常處理,用戶會知道出錯的環(huán)節(jié),并且你的程序也可以全身而退。這樣,是不是覺得程序和負責,又很溫柔。為什么要處理異常?17傳統(tǒng)的解決方式errorCodeTypereadFile{initializeerrorCode=0;①打開文件;if(打開文件成功){②判斷文件長

if(文件長取到){③分配內存

if(分內存成功){④讀入內存

if(讀文件失敗){errorCode=-1;}//讀文件判斷

}else{errorCode=-2;}//分配內存失敗

}else{errorCode=-3;}//取不到文件長⑤關閉文件;if(文件沒關&&errorCode==0){errorCode=-4;}else{errorCode=errorCodeand-4;}}else{errorCode=-5;}returnerrorCode;}

解決方法:寫大量的if語句。問題點:程序可讀性差,出錯返回信息量太少。18Java的解決方式readFile{//結構清楚,無需自己判斷,代碼量小。

try{

打開文件;判斷大小;分配內存;讀入內存;關掉文件;}catch(文件打開失敗){處理代碼;}catch(大小取不到失敗){處理代碼;}catch(內存分配失敗){處理代碼;}catch(讀取失敗){處理代碼;}catch(文件關閉失敗){處理代碼;}finally{

最終處理代碼}}解決法:利用異常處理,把出錯處理和正常代碼分開。19異常的分類記者請問Java中異常都有哪些呢?都要處理嗎?Java不一定。java中的異常類可分為兩大類:

Error類:是系統(tǒng)錯誤或運行環(huán)境出現(xiàn)的錯誤,這些錯誤一般是很嚴重的錯誤,即使捕捉到也無法處理,由Java虛擬機生成并拋出,包括系統(tǒng)崩潰、動態(tài)鏈接失敗、虛擬機錯誤等,在Java程序中不做處理。

Exception類:是指一些可以被捕獲且可能恢復的異常情況,是一般程序中可預知的問題。對于異常可分為兩類:(1)非運行時異常:在程序中必須對其進行處理,否則編譯器會指出錯誤。(2)運行時異常:程序中可以不做處理,直接由運行時系統(tǒng)來處理。20異常類的結構層次21如何處理異常---異常處理機制某程序Somebody------------------------------我有一個方法,readFile();但是這個方法在運行的時候可能會有問題。PublicvoidreadFile()throwsFileNotFoundException,IOException聲明拋出異常!做人要厚道,你應該坦誠地把你可能出的問題告訴別人。22程序A--------------------------------------我要調用Somebody里的一個方法Somebody.readFile();Try{

Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}捕獲異常!雖然這樣做有風險,但是值得。你放手去Try吧。記住要把出現(xiàn)的問題Catch住哦。否則編譯器不會放過你的。Java語言程序設計Q:我Catch住的是什么?A:對象!每當Java程序運行過程中發(fā)生一個可識別的運行錯誤時,即該錯誤有一個異常類與之相對應時,系統(tǒng)都會產(chǎn)生一個相應的該異常類的對象,即產(chǎn)生一個異常對象。你catch到的e,就是它。Q:我能拿e干什么?A:(1)StringgetMessage()(2)StringtoString()(3)voidprintStackTrace()24異常的拋出與捕獲PublicvoidreadFile()throwsFileNotFoundException,IOException{

if文件不存在

thrownewFileNotFoundException();if輸入輸入錯誤

throw

newIOException();}Try{Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}調用拋出異常捕獲異常聲明拋出真的拋出有可能拋出異常的方法必須要在方法頭里聲明:我會拋出異常!異??偸莵G給調用方去處理;25捕獲異常捕獲異常是通過try-catch-finally語句實現(xiàn)的。try{//接受監(jiān)視的程序塊,在此區(qū)域內發(fā)生的異常,由catch中指定的程序處理}catch(要處理的異常種類和標識符){//處理異常}catch(要處理的異常種類和標識符){//處理異常}…}finally{//最終處理}Try{Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}26拋出異常拋出異常是通過throw語句實現(xiàn)的。例:IOExceptione=newIOException();

throwe;注:可以拋出的異常必須是Throwable或其子類的實例。

thrownewString(“wanttothrow”);(錯誤)

PublicvoidreadFile()throwsFileNotFoundException,IOException{

if文件不存在

thrownewFileNotFoundException();if輸入輸入錯誤

thrownewIOException();}27聲明拋出異常如果方法不處理所出現(xiàn)的異常,則可在方法頭里聲明拋出異常異常會丟給調用方用方法聲明中的throws子句指明。例如:publicintread()throwsIOException{......}throws子句中同時可以指明多個異常,之間由逗號隔開。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException{…}PublicvoidconnectDatabase()throwsFileNotFoundException,IOException{

if文件不存在

thrownewFileNotFoundException();if輸入輸入錯誤

thrownewIOException();}28問題:在我的方法RunReadFile()里要調用somebody.readFile(),而該方法已經(jīng)聲明說它會有異常被拋出。那我該怎么辦?選擇A:捕獲異常,就地解決PublicvoidRunReadFile(){try{

somebody.readFile()}catch(FileNotFoundExceptione){…}catch(IOExceptione){…}}選擇B:不捕獲,拋出PublicvoidRunReadFile()throwsFileNotFoundException,IOException{

somebody.readFile()}選擇C:捕獲異常,處理一下再拋出PublicvoidRunReadFile()throwsFileNotFoundException,IOException{try{

somebody.readFile()}catch(FileNotFoundExceptione){

處理一下下;

throwe;}catch(IOExceptione){處理一下下;

throwe;}}29有些情況,系統(tǒng)不認為是異常,而程序員覺得挺嚴重,怎么辦?publicclassSeqStack{ intdata[]; intMAX; inttop;

… publicvoidpush(intitem){ if(top==MAX){

別人不會覺得這算異常,但是程序員覺得不好,如果超過最大值,程序員覺得這就算異常了。怎么辦?

} d

溫馨提示

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

評論

0/150

提交評論