版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章內(nèi)部類和異常類Java面向?qū)ο蟪绦蛟O(shè)計(jì)一些奇怪的類Java語言程序設(shè)計(jì)內(nèi)部類一個(gè)類中聲明另一個(gè)類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。Java語言程序設(shè)計(jì)publicclassChina{finalStringsong="義勇軍進(jìn)行曲";privateBeijingbeijing;//內(nèi)部類聲明的對(duì)象,作為外嵌類的成員
China(){
beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}classBeijing{//內(nèi)部類的聲明
Stringname="北京";voidspeak(){System.out.printf("%s\n%s","我們是"+name,"我們的國歌是:"+getSong());}}}Java語言程序設(shè)計(jì)內(nèi)部類小結(jié)外嵌類的成員變量在內(nèi)部類中仍然有效內(nèi)部類可以調(diào)用外嵌類的方法外嵌類的類體中可以使用內(nèi)部類來聲明變量反之則不可以Java語言程序設(shè)計(jì)匿名類情形1:子類去掉類聲明情形2:直接用接口名和類體創(chuàng)建Java語言程序設(shè)計(jì)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語言程序設(shè)計(jì)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);//接口回調(diào)
System.out.println("m="+m);Aa=newA();a.f(newCubic(){publicdoublegetCubic(doublex){returnx*x*x;}});}}Java語言程序設(shè)計(jì)匿名類小結(jié)匿名類無名可用,因此不能用匿名類聲明對(duì)象匿名類一定是內(nèi)部類,因此可以訪問外嵌類的成員變量和方法Java語言程序設(shè)計(jì)Class類是java.lang包里的一個(gè)類,實(shí)例用來封裝對(duì)象運(yùn)行時(shí)的狀態(tài)Java語言程序設(shè)計(jì)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("類中有如下的構(gòu)造方法:");
for(inti=0;i<con.length;i++){System.out.println(con[i].toString());}}}Java語言程序設(shè)計(jì)Class類小結(jié)不能用new來創(chuàng)建,只能用對(duì)象的.getClass()方法獲取Class類的對(duì)象getName()返回類的名字getDeclaredConstructors()返回類的全部構(gòu)造方法getDeclaredFields()返回類的全部成員變量cs.getDeclaredMethods()返回類的全部方法可用來生成一個(gè)類的實(shí)例,如Classcs=Class.forName("Circle");Circlecircle=(Circle)cs.newInstance();下面學(xué)習(xí)異常處理機(jī)制,包括異常類。Java語言程序設(shè)計(jì)13勤奮的倒霉事件薄之一窺我讓用戶輸入兩個(gè)數(shù)相除,可他竟然輸入了兩個(gè)0給我,暈!我去打開文件,可是發(fā)現(xiàn)本該存在的文件不知道被哪個(gè)家伙給刪掉了,倒霉!文件倒是沒有被刪掉,可以打不開。難道是被別的程序正在以獨(dú)享的方式打開著?我又不是別人肚子里的蛔蟲,我怎么知道別的程序在干什么。窩火!我去連接數(shù)據(jù)庫,可連不上。鬼知道數(shù)據(jù)庫那邊出什么事了。數(shù)據(jù)庫那邊不是我的地盤了。無奈!14倒霉的事情總會(huì)發(fā)生!!!無論你多有天分,也不能保證倒霉的事情一定不會(huì)發(fā)生。你需要處理異常狀況的程序。我怎么知道會(huì)出現(xiàn)哪些異常狀況?聽程序員勤奮說,異常處理的代碼寫起來好費(fèi)事,沒自信!如果你跟勤奮學(xué)習(xí)如何進(jìn)行異常處理,那準(zhǔn)備好1個(gè)月時(shí)間吧,也許你還不能學(xué)好。跟家明學(xué)習(xí),1天應(yīng)該夠了吧。而且還學(xué)得像模像樣的。15聽聽Java講解什么是異常記者您好。聽說您在異常處理方面取得了巨大的成就。Java是的,不謙虛地說,可以說是劃時(shí)代的進(jìn)步。記者那您簡單介紹一下什么是異常嗎?Java異常就是在程序的運(yùn)行過程中所發(fā)生的意外事件,它中斷指令的正常執(zhí)行。比如:打開文件;打不開咋辦?判斷大小;大小判斷失敗怎么辦?(磁帶)分配內(nèi)存;內(nèi)存不夠讀入內(nèi)存;文件讀不出來關(guān)掉文件;文件關(guān)不掉。16記者哦。那如果發(fā)生這樣的不幸,程序又能怎么辦呢?Java對(duì)于一個(gè)沒有做異常處理的程序來說,你會(huì)看到一些莫名奇妙的東西,程序也死掉了。記者這樣感覺程序好像很不負(fù)責(zé)任似的。用戶還不知道發(fā)生了什么事情,它就自己一死了之。Java不錯(cuò)。如果做了異常處理,用戶會(huì)知道出錯(cuò)的環(huán)節(jié),并且你的程序也可以全身而退。這樣,是不是覺得程序和負(fù)責(zé),又很溫柔。為什么要處理異常?17傳統(tǒng)的解決方式errorCodeTypereadFile{initializeerrorCode=0;①打開文件;if(打開文件成功){②判斷文件長
if(文件長取到){③分配內(nèi)存
if(分內(nèi)存成功){④讀入內(nèi)存
if(讀文件失敗){errorCode=-1;}//讀文件判斷
}else{errorCode=-2;}//分配內(nèi)存失敗
}else{errorCode=-3;}//取不到文件長⑤關(guān)閉文件;if(文件沒關(guān)&&errorCode==0){errorCode=-4;}else{errorCode=errorCodeand-4;}}else{errorCode=-5;}returnerrorCode;}
解決方法:寫大量的if語句。問題點(diǎn):程序可讀性差,出錯(cuò)返回信息量太少。18Java的解決方式readFile{//結(jié)構(gòu)清楚,無需自己判斷,代碼量小。
try{
打開文件;判斷大小;分配內(nèi)存;讀入內(nèi)存;關(guān)掉文件;}catch(文件打開失敗){處理代碼;}catch(大小取不到失敗){處理代碼;}catch(內(nèi)存分配失敗){處理代碼;}catch(讀取失敗){處理代碼;}catch(文件關(guān)閉失敗){處理代碼;}finally{
最終處理代碼}}解決法:利用異常處理,把出錯(cuò)處理和正常代碼分開。19異常的分類記者請(qǐng)問Java中異常都有哪些呢?都要處理嗎?Java不一定。java中的異常類可分為兩大類:
Error類:是系統(tǒng)錯(cuò)誤或運(yùn)行環(huán)境出現(xiàn)的錯(cuò)誤,這些錯(cuò)誤一般是很嚴(yán)重的錯(cuò)誤,即使捕捉到也無法處理,由Java虛擬機(jī)生成并拋出,包括系統(tǒng)崩潰、動(dòng)態(tài)鏈接失敗、虛擬機(jī)錯(cuò)誤等,在Java程序中不做處理。
Exception類:是指一些可以被捕獲且可能恢復(fù)的異常情況,是一般程序中可預(yù)知的問題。對(duì)于異常可分為兩類:(1)非運(yùn)行時(shí)異常:在程序中必須對(duì)其進(jìn)行處理,否則編譯器會(huì)指出錯(cuò)誤。(2)運(yùn)行時(shí)異常:程序中可以不做處理,直接由運(yùn)行時(shí)系統(tǒng)來處理。20異常類的結(jié)構(gòu)層次21如何處理異常---異常處理機(jī)制某程序Somebody------------------------------我有一個(gè)方法,readFile();但是這個(gè)方法在運(yùn)行的時(shí)候可能會(huì)有問題。PublicvoidreadFile()throwsFileNotFoundException,IOException聲明拋出異常!做人要厚道,你應(yīng)該坦誠地把你可能出的問題告訴別人。22程序A--------------------------------------我要調(diào)用Somebody里的一個(gè)方法Somebody.readFile();Try{
Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}捕獲異常!雖然這樣做有風(fēng)險(xiǎn),但是值得。你放手去Try吧。記住要把出現(xiàn)的問題Catch住哦。否則編譯器不會(huì)放過你的。Java語言程序設(shè)計(jì)Q:我Catch住的是什么?A:對(duì)象!每當(dāng)Java程序運(yùn)行過程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,即產(chǎn)生一個(gè)異常對(duì)象。你catch到的e,就是它。Q:我能拿e干什么?A:(1)StringgetMessage()(2)StringtoString()(3)voidprintStackTrace()24異常的拋出與捕獲PublicvoidreadFile()throwsFileNotFoundException,IOException{
if文件不存在
thrownewFileNotFoundException();if輸入輸入錯(cuò)誤
throw
newIOException();}Try{Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}調(diào)用拋出異常捕獲異常聲明拋出真的拋出有可能拋出異常的方法必須要在方法頭里聲明:我會(huì)拋出異常!異??偸莵G給調(diào)用方去處理;25捕獲異常捕獲異常是通過try-catch-finally語句實(shí)現(xiàn)的。try{//接受監(jiān)視的程序塊,在此區(qū)域內(nèi)發(fā)生的異常,由catch中指定的程序處理}catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常}catch(要處理的異常種類和標(biāo)識(shí)符){//處理異常}…}finally{//最終處理}Try{Somebody.readFile();}catch(FileNotFoundExceptione){}Catch(IOExcpetione){}26拋出異常拋出異常是通過throw語句實(shí)現(xiàn)的。例:IOExceptione=newIOException();
throwe;注:可以拋出的異常必須是Throwable或其子類的實(shí)例。
thrownewString(“wanttothrow”);(錯(cuò)誤)
PublicvoidreadFile()throwsFileNotFoundException,IOException{
if文件不存在
thrownewFileNotFoundException();if輸入輸入錯(cuò)誤
thrownewIOException();}27聲明拋出異常如果方法不處理所出現(xiàn)的異常,則可在方法頭里聲明拋出異常異常會(huì)丟給調(diào)用方用方法聲明中的throws子句指明。例如:publicintread()throwsIOException{......}throws子句中同時(shí)可以指明多個(gè)異常,之間由逗號(hào)隔開。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException{…}PublicvoidconnectDatabase()throwsFileNotFoundException,IOException{
if文件不存在
thrownewFileNotFoundException();if輸入輸入錯(cuò)誤
thrownewIOException();}28問題:在我的方法RunReadFile()里要調(diào)用somebody.readFile(),而該方法已經(jīng)聲明說它會(huì)有異常被拋出。那我該怎么辦?選擇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)不認(rèn)為是異常,而程序員覺得挺嚴(yán)重,怎么辦?publicclassSeqStack{ intdata[]; intMAX; inttop;
… publicvoidpush(intitem){ if(top==MAX){
別人不會(huì)覺得這算異常,但是程序員覺得不好,如果超過最大值,程序員覺得這就算異常了。怎么辦?
} d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年新能源發(fā)電設(shè)備自動(dòng)化裝置項(xiàng)目成效分析報(bào)告
- 2024年超鈾元素及其提取設(shè)備項(xiàng)目綜合評(píng)估報(bào)告
- 2024年裝在進(jìn)口飛機(jī)上的國產(chǎn)零備件和材料項(xiàng)目評(píng)價(jià)分析報(bào)告
- 質(zhì)量培訓(xùn)35環(huán)宇抽樣檢驗(yàn)培訓(xùn)教材
- 2024屆河北省唐山市唐縣第一中學(xué)高三5月學(xué)生學(xué)業(yè)能力調(diào)研考試數(shù)學(xué)試題
- 構(gòu)建幼兒園大閱讀體系的實(shí)踐研究 研究計(jì)劃+實(shí)施階段+結(jié)題報(bào)告
- 采購合同中的處罰條款
- 編撰物流合同執(zhí)行統(tǒng)計(jì)表
- 山東省棗莊市臺(tái)兒莊區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期中考試語文試題
- 遼寧省丹東市七校協(xié)作體2024-2025學(xué)年高一上學(xué)期11月期中生物試題
- 肝穿刺病人術(shù)后的護(hù)理措施
- 初二(四)班感恩主題
- 貸款業(yè)務(wù)三查培訓(xùn)課件
- 幼兒園嘔吐培訓(xùn)課件
- 【川教版】《生命 生態(tài) 安全》三年級(jí)上冊(cè) 第13課《情緒氣象圖》課件
- 幼師生涯發(fā)展報(bào)告
- 部分地區(qū)2024屆高三上學(xué)期語文期末試題分類匯編文言文閱讀(含答案)-2
- 風(fēng)濕熱護(hù)理查房
- 遼寧省盤錦市雙臺(tái)子區(qū)實(shí)驗(yàn)中學(xué)2023-2024學(xué)年九年級(jí)上學(xué)期第三次月考數(shù)學(xué)試題(含答案)
- 新生兒院感知識(shí)培訓(xùn)
- 血小板減少的護(hù)理查房
評(píng)論
0/150
提交評(píng)論