1. 程式人生 > >9.0異常處理

9.0異常處理

數據 logs dna 內容 語句 過多 array 數據類型 ear

---恢復內容開始---

  在程序中總是存在各種錯誤,使應用程序在運行時終止。為了在程序執行過程中發生錯誤時能正常運行,可以使用Java提供的異常處理機制捕獲可能發生的異常,對異常進行處理並使程序能正常運行。

異常概述

  假如有一輛轎車發生了故障,可能是某個零件發生了問題,也可能是沒郵了。如果由於零件問題,只需要更換零件就可以解決問題;如果是沒有油了,只需要加滿油就可以正常行駛了。程序中的異常與此類似,就對程序中可能發生異常的語句進行處理,使程序能夠正常執行。

  

---恢復內容結束---

  在程序開發過程中,可能存在各種錯誤,有些錯誤是可以避免的,而有些錯誤卻是意想不到的,在Java中把這些可能發生的錯誤稱為異常。圖示說明了異常類的繼承關系:

  技術分享

  Throwable類是所有異常類的超類,該類的兩個直接子類是error和exception。其中,error及其子類用於指示合理的應用程序不應該試圖捕獲的嚴重問題,exception及其子類給出了合理的應用程序需要捕獲的異常。

  從圖中可以看出,throwable類是所有異常類的超類,該類的兩個直接子類是error和exception。其中,error及其子類用於指示合理的應用程序不應該試圖捕獲的嚴重問題,exception及其子類給出了合理的應用程序需要捕獲的異常。

  註意:圖中列出了異常類的繼承關系,由於界面大小有限,而error類和exception類的子類又比較多,所以這裏使用other subclass代表error類和exception類的子類。

異常的分類

  在Java中可以捕獲的異常(即exception類的子類)分為可控式異常和運行時異常兩種類型。

    可控式異常

  在Java中把那些可以預知的錯誤,例如從文件中讀取數據、對數據庫進行操縱等,在程序編譯時就能對程序中可能存在的錯誤進行處理,並給出具體的錯誤信息,我們把這些錯誤稱為可控式異常。

  技術分享

  註意:由於在構造方法中加載com.mingrisoft包中的test類時,Java虛擬機沒有找到test類,從而引發了classnotfoundexception異常,所以在控制臺輸出了classsnotfoundexception這樣的異常信息,由於在執行“class.forname("com.mingrisofr.test");”語句時發生了異常,所以導致程序中的其他代碼沒有執行,所以在控制臺並沒有輸出“測試”和“888”。

    運行時異常

  (概念)在Java中有些錯誤時不能被編譯器檢測的,例如,在進行除法運算時,除數為零;試圖把一個不是由數字組成的字符串使用integer類的parseint()方法轉換為整數等,Java的編譯器是檢測不到的,因而能夠正常編譯,但是在運行時就會發生異常,我們把這些異常稱為運行時異常。表中列出了常用的運行時異常及說明》

  技術分享

  註意:上面代碼首先創建一個object對象o,該對象是通過object的子類interger創建的,也就是說object對象o是子類interger的實例,因此當使用string類將對象o強制轉換為字符串時出錯了,因為對象o是object的子類interger創建的,而不是string類創建的,所以產生了錯誤,如果將對象o強制轉換為interger類型就不會出錯,因為對象o是interger類創建的。

  說明:從輸出結果可以看出,程序發生arrayindexoutofboundsexception異常,該異常是indexoutofindexoutofboundsexception異常的子異常,當程序執行到語句“value=ex.getnum(6);”時發生了異常,一位數組中有兩個元素,數組下標的範圍是從0~5,所以用6作為數組下標的索引值發生了錯誤,因而導致下面的其他語句不會被執行,所以程序中只輸出了數組中第一個元素的值100,而沒有輸出最後一個元素的值60.

獲取異常信息

  獲取異常信息就好比工廠裏某個線路出現故障停電了,電工要從線路中找出故障的原因,就像程序中獲取到了異常信息。在Java中java.lang.Throwable類是所有異常類的超類,該類提供了獲得異常信息的方法。表中列出了獲取異常信息的方法及說明:

  技術分享

  註意:輸出結果是除數為0時發生的異常,其中前3行是printstacktrace()方法輸出的異常信息,第4行getmessage()方法輸出的異常信息,第5行是getlocalizedmessage()方法輸出的異常信息,最後一行是tostring()方法輸出的異常信息。在本裏的代碼中使用了太try……catch語句塊來捕獲程序中的異常信息,在try和catch之間兩個大括號內是程序需要正常執行,但是卻又有可能發生異常的代碼,在catch後的兩個大括號內是try和catch之間的代碼發生錯誤時執行的代碼,用於進行異常處理。

異常處理

  在Java語言中當程序發生異常時,可以使用try……catch、try……catch……finally或try……finally進行處理。

    使用try……catch處理異常

  對於程序中可能發生異常的語句,可以將其添加到try……catch語句塊中,這樣當程序發生異常時,就可以對其進行相應的處理。

  try……catch語句塊的語法格式如下:

  try{需要正常執行的語句}catch(exception ex){對異常進行處理的語句}

  try和catch是進行異常處理的關鍵字。try和catch之間的兩個大括號內是程序需要正常執行但又可能發生異常的語句。

  chatch後的兩個小括號內是程序需要處理的異常類型。catch後的兩個大括號內是對程序發生的異常進行處理的語句。

    使用try……catch……finally處理異常

  對於程序中可能發生異常的語句,可以將其添加到try……catch……finally語句塊中,這樣當程序發生異常時,就可以對其進行相應的處理。

  try……catch……finally語句塊的語法格式:

  try{需要執行的語句}catch(exception ex){對異常進行處理的語句}finally{一定會被處理的語句}

  try、catch和finally是進行異常處理的關鍵字。try和catch之間的兩個大括號內是程序需要正常執行但又可能發生異常的語句。

  catch後的兩個小括號內是程序需要處理的異常類型。catch後的兩個大括號內是對程序發生的異常進行處理的語句。finally後的兩個大括號內的語句,不管程序是否發生異常都要執行(也就是說程序執行完try和catch之間的語句或執行完catch後兩個大括號內的語句都將執行finally),因此finally語句塊通常用於執行垃圾回收、釋放資源等操作。

  註意:在Java中進行異常處理時,應該盡量使用finally塊進行資源回收,因為在try……catch……finally語句塊中,不管程序是否發生異常,最終都會執行finally語句塊,因此可以在finally塊中添加釋放資源的代碼。從輸出結果可以看出,程序在try語句塊中創建了IO對象,然後在finally語句塊中關閉了IO對象,釋放了內存資源。

    使用try……finally處理異常

  對於程序中可能發生異常的語句,可以將其添加到try……finally語句塊中,這樣當程序發生異常時,就可以在finally語句塊中當其進行相應的處理,另外當程序沒有發生異常時,執行完try和finally之間的語句後,也將執行finally語句塊中的代碼,因此可以在finally語句塊中放置一些必須執行的代碼,如釋放內存資源的代碼。語法格式:

  try{需要執行的語句}finally{一定會執行的語句}

  try和finally是進行異常處理的關鍵字。try和finally之間的兩個大括號內是程序需要正常執行但又可能發生異常的語句。finally後兩個大括號內的語句是不管程序是否發生異常最終都要執行的語句,因此finally語句塊通常用於放置程序中必須執行的代碼,如關閉數據庫連接、關閉IO流等。

  註意:在有try……finally語句塊的程序中,只要執行了try語句塊中的代碼,不管try語句塊是否發生異常,與該try語句塊對應的finally語句塊都一定會被執行,因此通常使用finally語句塊進行資源釋放。說明:從輸出結果可以看出,程序在try語句塊中穿件了IO對象並分配了內存資源,然後在finally語句塊中關閉了IO獨享並釋放了內存資源。

拋出異常

  對於程序中發生的異常,除了可以使用try……catch語句塊處理之外,還可以使用throws聲明或throw語句拋出異常。

    使用throws聲明拋出異常

  throws通常用於方法聲明,當方法中可能存在異常,卻不想在方法中對異常進行處理時,就可以在聲明方法時使用throws聲明拋出的異常,然後在調用該方法的其他方法中對異常進行處理(如使用try……catch語句或使用throw聲明拋出異常)。

  如果需要使用throws聲明拋出多個異常,各異常之間要用逗號隔開。throws聲明拋出異常的語法格式如下:

  數據類型  方法名(形參列表)  throws   異常類1,異常類2,……,異常類{

    方法體;

  }

  數據類型是基本數據類型或或對象類型

  方法名時Java語言的合法標識符。

  throws是拋出異常的關鍵字。

  異常類是Java語言的異常類或自定義異常類

  方法體是該方法需要執行的語句。

  使用throws拋出Exception異常。  public void showInfo() throws Exception{fileInputStream in = new FileInputStream("c"/Record.txt");}說明:showInfo()方法使用throws拋出了Exception異常,這樣在該方法中創建IO對象時就不會發生異常了,但是必須在調用該方法的其他方法中對Exception異常進行處理,否則調用該方法的其他方法會發生異常。

  定義methodName()方法,該方法調用了上面定義的showInfo()方法,並對showInfo()方法拋出的異常進行了處理。註意:methodName()方法調用了showInfo()方法,並對showInfo()方法拋出的Exception異常進行了處理,否則該方法將會出錯。

    使用throw語句拋出異常

  在通常情況下,程序發生錯誤時系統會自動拋出異常,而有時希望程序自行拋出異常,可以使用throw語句來實現。

  throw語句通常用在方法中,在程序中自行拋出異常,使用throw語句拋出的是異常類的實例,通常與if語句一起使用。

  throw語句的語法格式如下:throw new Exception("對異常的說明");

  throw 是拋出異常的關鍵字。Exception是異常類(通常使用自定義異常類)。

  註意:computeArea()方法根據原的半徑計算圓的面積,並且當圓的半徑小於0時,使用throw語句拋出異常,由於該方法使用throw語句拋出了異常,所以必須在調用方法時對其進行異常處理,本實例在主方法中使用try……catch語句對其進行了處理。

自定義異常

    創建自定義異常類

  (應用)創建自定義的異常類需要繼承自Exception類,並提供含有一個String類型形參的構造方法,該形參就是異常的描述信息,可以通過getMessage()方法獲得。例如:

  public class NewException extends EXception{public newException(String s){super(s);}}

  註意:上面代碼創建了一個自定義異常類NewException,也就是說NewException是自定義異常類的名稱,該類繼承自Exception類,該類構造方法的形參s是需要傳遞的異常描述信息,該信息可以通過異常類的getMessage()方法獲得。

    使用自定義異常類

  創建完自定義異常類後,就可以在程序中使用了,使用自定義異常類可以通過throw語句拋出異常。

  在項目中創建類,在該類中計算原的面積,設定原的半徑不能小於20,如果小於20,則調用自定義異常類NewException,處理程序所發生的異常。

異常的使用原則

  在程序中使用異常類,可以捕獲程序中的錯誤,但是異常的使用也要遵循一定的規則。下面是異常類的幾項使用原則:

  不要過多地使用異常,這樣會增加系統的負擔。在方法中使用try……catch語句塊捕獲異常時,要對異常進行處理。

  try……catch語句塊的範圍不要太大,這樣不利於對異常的分析。一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異常或子異常。

  小結:介紹Java中的異常處理機制。應了解異常的概念、幾種常見的異常類,掌握異常處理技術,以及如何創建、激活用戶自定義的異常處理器。Java中的異常處理是通過try……catch語句來實現的,也可以使用throw語句向上拋出。建議不要將異常拋出,應該編寫異常處理語句。對於異常處理的原則,也應該理解。

9.0異常處理