第6章 內部類與異常類_第1頁
第6章 內部類與異常類_第2頁
第6章 內部類與異常類_第3頁
第6章 內部類與異常類_第4頁
第6章 內部類與異常類_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章內部類與異常類6.1內部類6.2匿名類6.3異常類6.4斷言6.5Class類6.1內部類

Java支持在一個類中定義另一個類,這樣的類稱作內部類,而包含內部類的類成為內部類的外嵌類。

內部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內部類聲明對象,作為外嵌類的成員。例子1classChina{finalStringsong="義勇軍進行曲";privateBeijingbeijing;China(){beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}

classBeijing//內部類的聲明{Stringname="北京";voidspeak(){System.out.println("我們是"+name+"我們的國歌是:"+getSong());}}}publicclassExample6_1{publicstaticvoidmain(Stringargs[]){Chinachina=newChina();china.getBeijing().speak();}}

6.2匿名類

6.2.1和類有關的匿名類

當使用類創(chuàng)建對象時,程序允許我們把類體與對象的創(chuàng)建組合在一起,也就是說,類創(chuàng)建對象時,除了構造方法還有類體,此類體被認為是該類的一個子類去掉類聲明后的類體,稱作匿名類。例如:

newPeople(){People類的子類的類體

}例子2abstractclassSpeak{publicabstractvoidspeakHello();}classStudent{voidf(Speaksp){sp.speakHello();}}publicclassExample6_2{publicstaticvoidmain(Stringargs[]){Studentst=newStudent();st.f(newSpeak(){publicvoidspeakHello(){System.out.println("Iamastudent,howareyou");}});

Speakspeak=newSpeak(){publicvoidspeakHello(){System.out.println("大家好,祝工作順利!");}};speak.speakHello();//上轉型對象speak調用匿名類重寫的speakHello方法

}}6.2.2和接口有關的匿名類

Java允許直接用接口名和一個類體創(chuàng)建一個匿名對象,此類體被認為是實現(xiàn)了接口的類去掉類聲明后的類體,稱作匿名類。例如:

newComputable(){

使用了Computeable接口的類的類體

}例子3interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);//執(zhí)行匿名類體中實現(xiàn)的getCubic方法

System.out.println(result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic()//使用匿名類創(chuàng)建對象,將該對象傳遞給方法f的參數(shù)cubic{publicdoublegetCubic(doublex){returnx*x*x;}});Cubiccu=newCubic()//使用匿名類創(chuàng)建對象,接口cu存放該對象的引用

{publicdoublegetCubic(doublex)//匿名類是實現(xiàn)Cubic接口的類

{returnx*x*x;//所以必須要實現(xiàn)getCubic方法

}};doublem=cu.getCubic(5);//接口回調

System.out.println(m);}}6.3異常類

所謂異常就是運行時可能出現(xiàn)一些錯誤,程序運行出現(xiàn)異常時,Java運行環(huán)境就用異常類Exception的相應子類創(chuàng)建一個異常對象,并等待處理,例如,讀取一個不存在的文件時,運行環(huán)境就用異常類IOException創(chuàng)建一個對象,異常對象可以調用如下方法得到或輸出有關異常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()Java的異常類是處理運行時錯誤的特殊類,每一種異常類對應一種特定的運行錯誤。Java中的每個異常都是Throwable類及其子類的實例對象,異常類的層次結構圖如圖6-1所示。

Throwable類分為java.lang.Exception類和java.lang.Error類,即錯誤和異常子類。

Error是指與虛擬機或動態(tài)裝載等相關的問題,異常則是指一些可以被捕獲且可以被恢復的錯誤。圖6-1異常處理的類層次ObjectThrowableError…Exception…RuntimeExeption…

其中Error類由系統(tǒng)保留,而Exception類則供應用程序使用。

Exception類又分為兩種:運行時異常和非運行時異常。

運行時異常(RuntimeException)是在Java運行系統(tǒng)執(zhí)行過程中出現(xiàn)的異常。

非運行時異常(Non-RuntimeException)是由編譯器檢測到的,在程序運行過程中可能發(fā)生而要求必須處理的異常。系統(tǒng)定義的運行異常異常對應的系統(tǒng)運行錯誤ClassNotFoundException未找到欲裝載使用的類FileNotFoundException未找到指定的文件或目錄IOException輸入、輸出錯誤InterruptedException線程在睡眠、等待或因其他原因暫停時被其他線程打斷UnknownHostException無法確定主機的IP地址SecurityException安全性錯誤,如Applet欲讀寫文件MalformedURLExceptionURL格式錯誤下表中列出了若干常見的系統(tǒng)定義異常6.3.1try~catch~finally語句

使用try~catch~finally語句來處理異常,將可能出現(xiàn)的異常操作放在try~catch~finally語句的try部分,當try部分中的某個語句發(fā)生異常后,try部分將立刻結束執(zhí)行,而轉向執(zhí)行相應的catch部分;所以程序可以將發(fā)生異常后的處理放在catch部分;finally部分表示try或catch執(zhí)行完后,均需要執(zhí)行的部分try~catch,表示為try~catch提供一個統(tǒng)一的“出口”。try~catch~finally語句可以出現(xiàn)多個catch,分別處理發(fā)生的相應異常。try{Java語句塊}catch(異常錯誤類對象名){

異常處理語句塊}finally{Java語句塊}例:classExce{ publicstaticvoidmain(Stringargs[]) { inta,b,c,d; a=b=c=10; try{ d=a/(b-c); System.out.println("d="+d); }catch(ArithmeticExceptione){ System.out.println("除數(shù)不能為0");}finally{ d=1;System.out.println("d="+d);}}}例子4(效果如圖所示)publicclassExample6_4{publicstaticvoidmain(Stringargs[]){intn=0,m=0,t=555;try{m=Integer.parseInt("8888");n=Integer.parseInt("abc789");t=9999;}catch(NumberFormatExceptione){System.out.println("發(fā)生異常:"+e.getMessage());e.printStackTrace();n=123;}System.out.println("n="+n+",m="+m+",t="+t);}}6.3.2自定義異常類在程序中也可以定義Exception類的子類作為自定義異常類,然后規(guī)定哪些方法產生這樣的異常。這時就要用到throws和throw兩個關鍵字。

throws包含在方法的聲明中,其格式如下:返回類型方法名(參數(shù))throws異常類名{

語句體}

其中,異常類名可以是多個,但需要用逗號隔開。此時,方法并不需要處理它所生成的異常,而是向上傳遞,由調用它的方法來處理這些異常。

異常的主動拋出由throw關鍵字完成。throw語句的格式為:

throwThrowableobject;

其中ThrowableObject必須為Throwable類或其子類的對象。例如:thrownewArithmeticExcption()例子5classIntegerExceptionextendsException{Stringmessage;IntegerException(intm){message="年齡"+m+"不合理";}publicStringtoString(){returnmessage;}}classPeople{privateintage=1;publicvoidsetAge(intage)throwsIntegerException{if(age>=160||age<=0)thrownewIntegerException(age);elsethis.age=age;}publicintgetAge(){System.out.println("年齡"+age+"合理");returnage;}}publicclassExample6_5{publicstaticvoidmain(Stringargs[]){Peoplewang=newPeople(),zhang=newPeople();try{wang.setAge(189);System.out.println(wang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}try{zhang.setAge(28);System.out.println(zhang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}}}

在使用異常的過程中,要遵循以下的四點原則:(1)不要過多地使用異常,更不要在循環(huán)體內使用異常。(2)在捕獲或聲明異常時,要選取合適類型的異常類。(3)一旦捕獲了一個異常,就應對其做出相應的處理,而不應放任不管。(4)對于自定義的異常類,通常把它作為類Exception的子類,而不作為類Error的子類。并且在多數(shù)情況下,不要把自定義的異常類作為運行時異常類RuntimeException的子類。另外,自定義異常類的類名常常以Exception結尾。6.4斷言

斷言語句在調試代碼階段非常有用,斷言語句一般用于程序不準備通過捕獲異常來處理的錯誤。例如,當發(fā)生某個錯誤時,要求程序必須立即停止執(zhí)行。使用關鍵字assert聲明一條斷言語句,斷言語句有一下兩種格式:

assertbooleanExpression;assertbooleanExpression:messageException;

其中booleanExpression必須是求值為boolean型的表達式;messageException可以是值為字符串的表達式。例子6importjava.util.Scanner;publicclassExample6_6{publicstaticvoidmain(Stringargs[]){System.out.println("請正數(shù)回車確認");Scannerscan=newScanner(System.in);doublenumber=scan.nextDouble();assertnumber>0:"負數(shù)不能計算平方根";System.out.println(number+"的平方根:"+Math.sqrt(number));}}6.5Class類6.5.1獲取類的有關信息

Class是java.lang包中的類,該類的實例用來封裝對象運行時的狀態(tài)。當一個類被加載且創(chuàng)建對象時,和該類相關的一個類型為Calss的對象就會自動創(chuàng)建。

Class類本身不提供構造方法,因此,不能使用new運算符和構造方法顯示地創(chuàng)建一個Class對象。

任何對象調用getClass()方法都可以獲取和該對象相關的一個Class對象,這個Class對象調用如下的方法可以獲取創(chuàng)建對象的類的有關信息:

publicStringgetName()publicConstructor[]getDeclaredConstructors()publicField[]getDeclareFields()publicMethod[]getDeclaredMethods()例子7importjava.lang.reflect.*;classRect{doublewidth,height,area;publicdoublegetArea(){area=height*width;returnarea;}}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());}}}6.5.2使用Class實例化一個對象

創(chuàng)建對象最常用的方式就是使用new運算符和類的構造方法,實際上我們也可以使用Class對象得到一個類的實例

溫馨提示

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

評論

0/150

提交評論