se高級(jí)第5天異常、object類_第1頁
se高級(jí)第5天異常、object類_第2頁
se高級(jí)第5天異常、object類_第3頁
se高級(jí)第5天異常、object類_第4頁
se高級(jí)第5天異常、object類_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余12頁可下載查看

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第5天 異常今日學(xué)習(xí)內(nèi)容異常今日學(xué)習(xí)目標(biāo)能夠辨別程序中異常和錯(cuò)誤的區(qū)別說出異常的分類說出虛擬機(jī)處理異常的方式列舉出常見的四個(gè)運(yùn)行期異常能夠使用try.catch關(guān)鍵字處理異常能夠使用throws關(guān)鍵字處理異常能夠自定義異常類能夠處理自定義異常類能夠理解Object的equals方法能偶理解Object的toString方法Object類在以前的學(xué)習(xí)過程中,我們都在學(xué)習(xí)對(duì)象基本特征、對(duì)象的使用以及對(duì)象的關(guān)系。接下來我們開始使用對(duì)象做事情,那么在使用對(duì)象做事情之前,我們要學(xué)習(xí)一些API中提供的常用對(duì)象。首先來學(xué)習(xí)API中的Object這個(gè)類。Object類概述Object類是Java語言中的根類,

2、即所有類的父類。它中描述的所有方法子類都可以使用。所有類在創(chuàng)建對(duì)象的時(shí)候,最終找的父類就是Object。在Object類眾多方法中,我們先學(xué)習(xí)equals方法與toString方法,其他方法后面課程中會(huì)陸續(xù)學(xué)到。equals方法equals方法,用于比較兩個(gè)對(duì)象是否相同,它其實(shí)就是使用兩個(gè)對(duì)象的內(nèi)存地址在比較。Object類中的equals方法內(nèi)部使用的就是=比較運(yùn)算符。在開發(fā)中要比較兩個(gè)對(duì)象是否相同,經(jīng)常會(huì)根據(jù)對(duì)象中的屬性值進(jìn)行比較,也就是在開發(fā)經(jīng)常需要子類重寫equals方法根據(jù)對(duì)象的屬性值進(jìn)行比較。如下代碼演示:/*描述人這個(gè)類,并定義功能根據(jù)年齡判斷是否是同齡人由于要根據(jù)指定類的屬性進(jìn)

3、行比較,這時(shí)只要覆蓋Object中的equals方法在方法體中根據(jù)類的屬性值進(jìn)行比較 */class Person extends Objectint age ;/復(fù)寫父類的equals方法,實(shí)現(xiàn)自己的比較方式public boolean equals(Object obj) /判斷當(dāng)前調(diào)用equals方法的對(duì)象和傳遞進(jìn)來的對(duì)象是否是同一個(gè)if(this = obj)return true;/判斷傳遞進(jìn)來的對(duì)象是否是Person類型if(!(obj instanceof Person)return false;/將obj向下轉(zhuǎn)型為Perosn引用,訪問其屬性Person p = (Person

4、)obj;return this.age = p.age;注意:在復(fù)寫Object中的equals方法時(shí),一定要注意public boolean equals(Object obj)的參數(shù)是Object類型,在調(diào)用對(duì)象的屬性時(shí),一定要進(jìn)行類型轉(zhuǎn)換,在轉(zhuǎn)換之前必須進(jìn)行類型判斷。友情提示:需要重寫的時(shí)候可以利用eclipse提供的快捷鍵直接生成toString方法toString方法返回該對(duì)象的字符串表示,其實(shí)該字符串內(nèi)容就是對(duì)象的類型+內(nèi)存地址值。由于toString方法返回的結(jié)果是內(nèi)存地址,而在開發(fā)中,經(jīng)常需要按照對(duì)象的屬性得到相應(yīng)的字符串表現(xiàn)形式,因此也需要重寫它。class Person

5、extends Objectint age ;/根據(jù)Person類的屬性重寫toString方法public String toString() return Person age= + age + ;注意:在我們直接使用輸出語句輸出對(duì)象名的時(shí)候,其實(shí)通過該對(duì)象調(diào)用了其toString()方法. toString()方法在eclipse里也有快捷鍵生成.異常異常概念在Java等面向?qū)ο蟮木幊陶Z言中,異常本身是一個(gè)類,產(chǎn)生異常就是創(chuàng)建異常對(duì)象并拋出了一個(gè)異常對(duì)象。Java處理異常的方式是中斷處理。異常分類異常的根類是Throwable,其下有兩個(gè)子類:Error與Exception,平常所說的異

6、常指Exception。嚴(yán)重錯(cuò)誤Error,無法通過處理的錯(cuò)誤編譯時(shí)異常Exception,編譯時(shí)無法編譯通過。如日期格式化異常運(yùn)行時(shí)異常RuntimeException,是Exception的子類,運(yùn)行時(shí)可能會(huì)報(bào)錯(cuò),可以不處理。如數(shù)學(xué)異常異?;静僮鲃?chuàng)建異常對(duì)象(JDK已定義的異常會(huì)自動(dòng)創(chuàng)建對(duì)象,自定義異常需要手動(dòng)創(chuàng)建)拋出異常(JDK已有定義的異常會(huì)自動(dòng)拋出異常,自定義異常需要手動(dòng)拋出)處理異常:捕獲處理,將異常獲取,使用try/catch做分支處理try需要檢測(cè)的異常; catch(異常對(duì)象) 異常處理代碼可以調(diào)用異常的方法通常我們只使用一個(gè)方法:printStackTrace打印異常信

7、息聲明拋出處理,出現(xiàn)異常后不處理,聲明拋出給調(diào)用者處理。方法聲明上加throws 異常類名注意:異常處理,指處理的一種可能性,即有了異常處理的代碼,不一定會(huì)產(chǎn)生異常。如果沒有產(chǎn)生異常,則代碼正常執(zhí)行,如果產(chǎn)生了異常,則中斷當(dāng)前執(zhí)行代碼,執(zhí)行異常處理代碼。異常的產(chǎn)生過程解析先運(yùn)行下面的程序,程序會(huì)產(chǎn)生一個(gè)數(shù)組索引越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產(chǎn)生的過程。工具類class ArrayTools/對(duì)給定的數(shù)組通過給定的角標(biāo)獲取元素。public static int getElement(int arr,int index) int elem

8、ent = arrindex; return element;測(cè)試類class ExceptionDemo2 public static void main(String args) int arr = 34,12,67;int num = ArrayTools.getElement(arr,4)System.out.println(num=+num);System.out.println(over);上述程序執(zhí)行過程圖解:2.4.1拋出異常throw在編寫程序時(shí),我們必須要考慮程序出現(xiàn)問題的情況。比如,在定義方法時(shí),方法需要接受參數(shù)。那么,當(dāng)調(diào)用方法使用接受到的參數(shù)時(shí),首先需要先對(duì)參數(shù)數(shù)據(jù)進(jìn)

9、行合法的判斷,數(shù)據(jù)若不合法,就應(yīng)該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進(jìn)來。這時(shí)需要使用拋出異常的方式來告訴調(diào)用者。在java中,提供了一個(gè)throw關(guān)鍵字,它用來拋出一個(gè)指定的異常對(duì)象。那么,拋出一個(gè)異常具體如何操作呢?1,創(chuàng)建一個(gè)異常對(duì)象。封裝一些提示信息(信息可以自己編寫)。2,需要將這個(gè)異常對(duì)象告知給調(diào)用者。怎么告知呢?怎么將這個(gè)異常對(duì)象傳遞到調(diào)用者處呢?通過關(guān)鍵字throw就可以完成。throw 異常對(duì)象;throw用在方法內(nèi),用來拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。使用格式:throw new 異常類名(參數(shù));例如:throw new NullPointe

10、rException(要訪問的arr數(shù)組不存在);throw new ArrayIndexOutOfBoundsException(該索引在數(shù)組中不存在,已超出范圍);下面是異常類ArrayIndexOutOfBoundsException與NullPointerException的構(gòu)造方法學(xué)習(xí)完拋出異常的格式后,我們通過下面程序演示下throw的使用。編寫工具類,提供獲取數(shù)組指定索引處的元素值class ArrayTools/通過給定的數(shù)組,返回給定的索引對(duì)應(yīng)的元素值。public static int getElement(int arr,int index)/*若程序出了異常,JVM它會(huì)

11、打包異常對(duì)象并拋出。但是它所提供的信息不夠給力。想要更清晰,需要自己拋出異常信息。下面判斷條件如果滿足,當(dāng)執(zhí)行完throw拋出異常對(duì)象后,方法已經(jīng)無法繼續(xù)運(yùn)算。這時(shí)就會(huì)結(jié)束當(dāng)前方法的執(zhí)行,并將異常告知給調(diào)用者。這時(shí)就需要通過異常來解決。*/if(arr=null)throw new NullPointerException(arr指向的數(shù)組不存在);if(index=arr.length)throw new ArrayIndexOutOfBoundsException(錯(cuò)誤的角標(biāo),+index+索引在數(shù)組中不存在);int element = arrindex;return element;測(cè)

12、試類class ExceptionDemo3 public static void main(String args) int arr = 34,12,67; /創(chuàng)建數(shù)組int num = ArrayTools.getElement(null,2);/ 調(diào)用方法,獲取數(shù)組中指定索引處元素/int num = ArrayTools.getElement(arr,5);/ 調(diào)用方法,獲取數(shù)組中指定索引處元素System.out.println(num=+num);/打印獲取到的元素值2.4.2聲明異常throws聲明:將問題標(biāo)識(shí)出來,報(bào)告給調(diào)用者。如果方法內(nèi)通過throw拋出了編譯時(shí)異常,而沒有捕

13、獲處理(稍后講解該方式),那么必須通過throws進(jìn)行聲明,讓調(diào)用者去處理。聲明異常格式:修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2 聲明異常的代碼演示:/* * 如果定義功能時(shí)有問題發(fā)生需要報(bào)告給調(diào)用者。可以通過在方法上使用throws關(guān)鍵字進(jìn)行聲明。 */public class Test publicstaticvoid main(String args) throws FileNotFoundException /* * 當(dāng)我們創(chuàng)建 字符輸入流對(duì)象的時(shí)候 也就是調(diào)用FileReader構(gòu)造方法的時(shí)候產(chǎn)生了異常 * 當(dāng)這個(gè)構(gòu)造有異常的時(shí)候,必須報(bào)告給調(diào)用者,

14、這時(shí)我們需要在方法上使用throws關(guān)鍵字聲明 */ FileReader fr = new FileReader(a.txt); throws用于進(jìn)行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個(gè)異常類,用逗號(hào)隔開。多個(gè)異常的情況,例如:publicclass Test publicstaticvoid main(String args) throws FileNotFoundException,IOException /* * new FileReader(a.txt)產(chǎn)生了FileNotFoundException異常 */ FileReader fr =

15、 new FileReader(a.txt); /* * fr.read()這個(gè)功能中存在 IOException異常 */int c = fr.read(); System.out.println(c); 2.4.3捕獲異常trycatchfinally捕獲:Java中對(duì)異常有針對(duì)性的語句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理捕獲異常格式:try /需要被檢測(cè)的語句。catch(異常類 變量) /參數(shù)。/異常的處理語句。finally /一定會(huì)被執(zhí)行的語句。try:該代碼塊中編寫可能產(chǎn)生異常的代碼。catch:用來進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。finally:有一些特

16、定的代碼無論異常是否發(fā)生,都需要執(zhí)行。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語句執(zhí)行不到。而finally就是解決這個(gè)問題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。演示如下:publicclass Test publicstaticvoid main(String args) FileReader fr = null;try /當(dāng)產(chǎn)生異常時(shí),必須有處理方式。要么捕獲,要么聲明。fr = new FileReader(a.txt);int c = fr.read();System.out.println(c); catch (IOException e) /括號(hào)中需要定義什么呢?

17、try中拋出的是什么異常,在括號(hào)中就定義什么異常類型。 System.out.println(讀取文件時(shí)候出現(xiàn)了異常); finallyif(fr!=null)/如果流存在 需要在最后釋放掉 不管前面有沒有異常 都應(yīng)該做try fr.close();/釋放流資源/關(guān)閉流的時(shí)候 又有了異常 那么也可以在進(jìn)行一次try.catch catch (IOException e) System.out.println(釋放資源出現(xiàn)了異常);異常注意事項(xiàng)多異常處理捕獲處理:1多個(gè)異常分別處理2多個(gè)異常一次捕獲多次處理3多個(gè)異常一次捕獲一次處理聲明拋出異常:聲明上使用,一次聲明多個(gè)異常運(yùn)行時(shí)異常被拋出可以不

18、處理。即不捕獲也不聲明拋出如果父類拋出了多個(gè)異常,子類覆蓋父類方法時(shí),只能拋出相同的異常或者是他的子集父類方法沒有拋出異常,子類覆蓋父類該方法時(shí)也不可拋出異常。此時(shí)子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出當(dāng)多異常處理時(shí),捕獲處理,前邊的類不能是后邊類的父類在try/catch后可以追加finally代碼塊,其中的代碼一定會(huì)被執(zhí)行,通常用于資源回收。代碼演示:void show() /不用throws try 可能出現(xiàn)異常的代碼catch(Exception e)/處理方式一個(gè)try 多個(gè)catch組合 : 對(duì)代碼進(jìn)行異常檢測(cè),并對(duì)檢測(cè)的異常傳遞給catch處理。對(duì)每種異常信息進(jìn)行不同的捕獲處

19、理。void show() /不用throws trycatch(XxxException e)/處理方式catch(YyyException e)/處理方式catch(ZzzException e)/處理方式注意:這種異常處理方式,要求多個(gè)catch中的異常不能相同,并且若catch中的多個(gè)異常之間有子父類異常的關(guān)系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。try finally 組合: 對(duì)代碼進(jìn)行異常檢測(cè),檢測(cè)到異常后因?yàn)闆]有catch,所以一樣會(huì)被默認(rèn)jvm拋出。異常是沒有捕獲處理的。但是功能所開啟資源需要進(jìn)行關(guān)閉,所有finally。只為關(guān)閉資源。voi

20、d show()/需要throws try throw new Exception();finally /釋放資源自定義異常在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實(shí)際開發(fā)中也會(huì)出現(xiàn)很多異常,這些異常很可能在JDK中沒有定義過,例如年齡負(fù)數(shù)問題,考試成績(jī)負(fù)數(shù)問題.那么能不能自己定義異常呢?之前的幾個(gè)異常都是java通過類進(jìn)行的描述。并將問題封裝成對(duì)象,異常就是將問題封裝成了對(duì)象。這些異常不好認(rèn),書寫也很不方便,能不能定義一個(gè)符合我的程序要求的異常名稱。既然JDK中是使用類在描述異常信息,那么我們也可以模擬Java的這種機(jī)制,我們自己定義異常的信息,異常的名字,讓異常更符合自己程序

21、的閱讀。準(zhǔn)確對(duì)自己所需要的異常進(jìn)行類的描述。自定義異常類的定義通過閱讀異常源代碼:發(fā)現(xiàn)java中所有的異常類,都是繼承Throwable,或者繼承Throwable的子類。這樣該異常才可以被throw拋出。說明這個(gè)異常體系具備一個(gè)特有的特性:可拋性:即可以被throw關(guān)鍵字操作。并且查閱異常子類源碼,發(fā)現(xiàn)每個(gè)異常中都調(diào)用了父類的構(gòu)造方法,把異常描述信息傳遞給了父類,讓父類幫我們進(jìn)行異常信息的封裝。例如NullPointerException異常類源代碼:publicclass NullPointerException extends RuntimeException public NullPo

22、interException() super();/調(diào)用父類構(gòu)造方法 public NullPointerException(String s) super(s);/調(diào)用父類具有異常信息的構(gòu)造方法 現(xiàn)在,我們來定義個(gè)自己的異常,即自定義異常。格式:Class 異常名 extends Exception /或繼承RuntimeExceptionpublic 異常名()public 異常名(String s) super(s); 自定義異常繼承Exception演示class MyException extends Exception/*為什么要定義構(gòu)造函數(shù),因?yàn)榭吹絁ava中的異常描述類中有提供

23、對(duì)異常對(duì)象的初始化方法。*/public MyException()super();public MyException(String message)super(message);/ 如果自定義異常需要異常信息,可以通過調(diào)用父類的帶有字符串參數(shù)的構(gòu)造函數(shù)即可。自定義異常繼承RuntimeException演示class MyException extends RuntimeException/*為什么要定義構(gòu)造函數(shù),因?yàn)榭吹絁ava中的異常描述類中有提供對(duì)異常對(duì)象的初始化方法。*/MyException()super();MyException(String message)super(message);/ 如果自定義異常需要異常信息,可以通過調(diào)用父類的帶有字符串參數(shù)的構(gòu)造函數(shù)即可。自定義異常的練習(xí)定義Person類,包含name與age兩個(gè)成員變量。在Person類的有參數(shù)構(gòu)造方法中,進(jìn)行年齡范圍的判斷,若年齡為負(fù)數(shù)或大于200歲,則拋出NoAgeException異常,異常提示信息“年齡數(shù)值非法”。要求:在測(cè)試類中,調(diào)用有參數(shù)構(gòu)造方法,完成Person對(duì)象創(chuàng)建,并進(jìn)行異常的處理。自定義異常類class NoAgeException extends ExceptionNoAgeE

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論