




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章內部類與異常類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和類有關的匿名類
當使用類創建對象時,程序允許我們把類體與對象的創建組合在一起,也就是說,類創建對象時,除了構造方法還有類體,此類體被認為是該類的一個子類去掉類聲明后的類體,稱作匿名類。例如:
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允許直接用接口名和一個類體創建一個匿名對象,此類體被認為是實現了接口的類去掉類聲明后的類體,稱作匿名類。例如:
newComputable(){
使用了Computeable接口的類的類體
}例子3interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);//執行匿名類體中實現的getCubic方法
System.out.println(result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic()//使用匿名類創建對象,將該對象傳遞給方法f的參數cubic{publicdoublegetCubic(doublex){returnx*x*x;}});Cubiccu=newCubic()//使用匿名類創建對象,接口cu存放該對象的引用
{publicdoublegetCubic(doublex)//匿名類是實現Cubic接口的類
{returnx*x*x;//所以必須要實現getCubic方法
}};doublem=cu.getCubic(5);//接口回調
System.out.println(m);}}6.3異常類
所謂異常就是運行時可能出現一些錯誤,程序運行出現異常時,Java運行環境就用異常類Exception的相應子類創建一個異常對象,并等待處理,例如,讀取一個不存在的文件時,運行環境就用異常類IOException創建一個對象,異常對象可以調用如下方法得到或輸出有關異常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()Java的異常類是處理運行時錯誤的特殊類,每一種異常類對應一種特定的運行錯誤。Java中的每個異常都是Throwable類及其子類的實例對象,異常類的層次結構圖如圖6-1所示。
Throwable類分為java.lang.Exception類和java.lang.Error類,即錯誤和異常子類。
Error是指與虛擬機或動態裝載等相關的問題,異常則是指一些可以被捕獲且可以被恢復的錯誤。圖6-1異常處理的類層次ObjectThrowableError…Exception…RuntimeExeption…
其中Error類由系統保留,而Exception類則供應用程序使用。
Exception類又分為兩種:運行時異常和非運行時異常。
運行時異常(RuntimeException)是在Java運行系統執行過程中出現的異常。
非運行時異常(Non-RuntimeException)是由編譯器檢測到的,在程序運行過程中可能發生而要求必須處理的異常。系統定義的運行異常異常對應的系統運行錯誤ClassNotFoundException未找到欲裝載使用的類FileNotFoundException未找到指定的文件或目錄IOException輸入、輸出錯誤InterruptedException線程在睡眠、等待或因其他原因暫停時被其他線程打斷UnknownHostException無法確定主機的IP地址SecurityException安全性錯誤,如Applet欲讀寫文件MalformedURLExceptionURL格式錯誤下表中列出了若干常見的系統定義異常6.3.1try~catch~finally語句
使用try~catch~finally語句來處理異常,將可能出現的異常操作放在try~catch~finally語句的try部分,當try部分中的某個語句發生異常后,try部分將立刻結束執行,而轉向執行相應的catch部分;所以程序可以將發生異常后的處理放在catch部分;finally部分表示try或catch執行完后,均需要執行的部分try~catch,表示為try~catch提供一個統一的“出口”。try~catch~finally語句可以出現多個catch,分別處理發生的相應異常。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("除數不能為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("發生異常:"+e.getMessage());e.printStackTrace();n=123;}System.out.println("n="+n+",m="+m+",t="+t);}}6.3.2自定義異常類在程序中也可以定義Exception類的子類作為自定義異常類,然后規定哪些方法產生這樣的異常。這時就要用到throws和throw兩個關鍵字。
throws包含在方法的聲明中,其格式如下:返回類型方法名(參數)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)不要過多地使用異常,更不要在循環體內使用異常。(2)在捕獲或聲明異常時,要選取合適類型的異常類。(3)一旦捕獲了一個異常,就應對其做出相應的處理,而不應放任不管。(4)對于自定義的異常類,通常把它作為類Exception的子類,而不作為類Error的子類。并且在多數情況下,不要把自定義的異常類作為運行時異常類RuntimeException的子類。另外,自定義異常類的類名常常以Exception結尾。6.4斷言
斷言語句在調試代碼階段非常有用,斷言語句一般用于程序不準備通過捕獲異常來處理的錯誤。例如,當發生某個錯誤時,要求程序必須立即停止執行。使用關鍵字assert聲明一條斷言語句,斷言語句有一下兩種格式:
assertbooleanExpression;assertbooleanExpression:messageException;
其中booleanExpression必須是求值為boolean型的表達式;messageException可以是值為字符串的表達式。例子6importjava.util.Scanner;publicclassExample6_6{publicstaticvoidmain(Stringargs[]){System.out.println("請正數回車確認");Scannerscan=newScanner(System.in);doublenumber=scan.nextDouble();assertnumber>0:"負數不能計算平方根";System.out.println(number+"的平方根:"+Math.sqrt(number));}}6.5Class類6.5.1獲取類的有關信息
Class是java.lang包中的類,該類的實例用來封裝對象運行時的狀態。當一個類被加載且創建對象時,和該類相關的一個類型為Calss的對象就會自動創建。
Class類本身不提供構造方法,因此,不能使用new運算符和構造方法顯示地創建一個Class對象。
任何對象調用getClass()方法都可以獲取和該對象相關的一個Class對象,這個Class對象調用如下的方法可以獲取創建對象的類的有關信息:
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實例化一個對象
創建對象最常用的方式就是使用new運算符和類的構造方法,實際上我們也可以使用Class對象得到一個類的實例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路工程考試知識薄弱環節分析試題及答案
- 供應商管理中的測試要求試題及答案
- 金屬加工機械的塑性變形與成形工藝考核試卷
- 金屬冶煉安全應急響應與處理考核試卷
- 發展潛力嵌入式系統試題及答案
- 禮儀用品行業綠色生產考核試卷
- 軟件測試中的自動化與效率提升試題及答案
- 嵌入式系統的前沿技術考題及答案
- 信息系統監理師考試成功秘笈試題及答案2025
- 公路建設項目評審試題及答案
- 國家開放大學2025年春《形勢與政策》形考任務1-5和大作業參考答案
- 工人下班免責協議書
- 美術有趣的課件
- 大理石知識培訓課件
- 2025年福建省廈門市中考數學二檢試卷
- 《擁抱健康拒絕煙草》課件
- 濟南幼兒師范高等專科學校招聘真題2024
- 定額〔2025〕1號文-關于發布2018版電力建設工程概預算定額2024年度價格水平調整的通知
- 10SG614-2 砌體填充墻構造詳圖(二)(與主體結構柔性連接)
- 固體料倉 (2.26)設計計算
- 東北大學機械設計課程設計zl10
評論
0/150
提交評論