Java面向對象程序設計(IDEA版) 課件 第9章異常處理_第1頁
Java面向對象程序設計(IDEA版) 課件 第9章異常處理_第2頁
Java面向對象程序設計(IDEA版) 課件 第9章異常處理_第3頁
Java面向對象程序設計(IDEA版) 課件 第9章異常處理_第4頁
Java面向對象程序設計(IDEA版) 課件 第9章異常處理_第5頁
已閱讀5頁,還剩50頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

面向對象程序設計第9章異常處理

1異常與異常類23主要內容面向對象程序設計(Java語言描述微課版基于IntelliJIDEA)捕獲異常捕獲多個異常45throws短語和throw語句try-with-resources語句6自定義異常類7斷言8案例:數組不匹配異常面向對象程序設計9.1異常與異常類程序運行不可避免會產生錯誤。Java語言提供了健壯的錯誤處理機制,即異常處理。同大多數現代編程語言一樣,Java語言有著健壯的異常處理機制。本節首先討論異常和異常類,下一節討論如何處理異常。概述所謂異常(exception)是在程序運行過程中產生的使程序終止正常運行的錯誤對象。如數組下標越界、整數除法中零作除數、文件找不到等都可能使程序終止運行9.1.1異常的概念為了理解異常的概念,首先看下面的代碼。Stringname=null;System.out.println(name.length());該段代碼編譯不會發生錯誤,但運行時控制臺輸出如下:Exceptioninthread"main"java.lang.NullPointerExceptionatExceptionDemo.main(ExceptionDemo.java:4)該輸出內容說明程序發生了異常,第一行給出了異常名稱,第二行給出了異常發生的位置。9.1.1異常的概念Java語言規定當某個對象的引用為null時,調用該對象的方法或使用對象時就會產生NullPointerException異常,它稱為空指針異常。packagecom.boda.xy;publicclassInputChar{publicstaticvoidmain(String[]args){System.out.print("請輸入一個字符:");charc=(char)System.in.read();//該行發生編譯錯誤System.out.println("c="+c);}}含義是:未處理的IOException類型異常程序9.1InputChar.javaJava語言定義了多種異常類。都是java.lang.Throwable類的子類,它是Object類的直接子類。Throwable類有兩個子類,一個是Error類,另一個是Exception類,這兩個子類又分別有若干個子類。圖10-1給出了Throwable類及其常見子類的層次結構。9.1.2異常類非檢查異常(uncheckedexception)是RuntimeException類及其子類異常,也稱為運行時異常。常見的非檢查異常如圖10-2所示。1.非檢查異常非檢查異常是在程序運行時檢測到的,可能發生在程序的任何地方且數量較大,因此編譯器不對非檢查異常(包括Error類的子類)處理,這種異常又稱免檢異常。1.非檢查異常程序運行時發生非檢查異常時運行時系統會把異常對象交給默認的異常處理程序,在控制臺顯示異常的內容及發生異常的位置。下面介紹幾種常見的運行時異常。(1)NullPointerException:空指針異常,即當某個對象的引用為null時調用該對象的方法或使用對象時就會產生該異常,如:Stringname=null;System.out.println(name.length());//該語句發生異常1.非檢查異常(2)ArithmeticException:算術異常,在做整數的除法或整數求余運算時可能產生的異常,它是在除數為零時產生的異常。inta=5;intb=a/0;//該語句發生異常注意:浮點數除法運算不會產生該類異常。如,1.0/0.0的結果為Infinity。1.非檢查異常(3)ClassCastException:對象轉換異常,Java支持對象類型轉換,若不符合轉換的規定,則產生類轉換異常,例如:Objecto=newObject();Strings=(String)o;//該語句發生異常1.非檢查異常(4)ArrayIndexOutOfBoundsException:數組下標越界異常,當引用數組元素的下標超出范圍時產生的異常,例如:inta[]=newint[5];a[5]=10;//該語句發生異常因為定義的數組a的長度為5,不存在a[5]這個元素,因此發生數組下標越界異常。1.非檢查異常(5)NumberFormatException:數字格式錯誤異常,在將字符串轉換為數值時,如果字符串不能正確轉換成數值則產生該異常,例如:doubled=Double.parseDouble("5m7.8");//該語句發生異常該語句產生異常的原因是,字符串"5m7.8"不能正確轉換成double型數據。1.非檢查異常檢查異常(checkedexception)是除RuntimeException類及其子類以外的異常類,有時也稱為必檢異常或非運行時異常。對這類異常,程序必須捕獲或聲明拋出,否則編譯不能通過。2.檢查異常程序10.1中的read()方法聲明拋出IOException異常就是檢查異常。再比如,若試圖使用Java命令運行一個不存在的類,則會產生ClassNotFoundException異常,若調用了一個不存在的方法,則會產生NoSuchMethodException異常。面向對象程序設計9.2捕獲異常異常處理可分為下面幾種:使用try-catch-finally捕獲并處理異常;通過throws子句聲明拋出異常;用throw語句拋出異常;使用try-with-resources管理資源。概述異常都是在方法中產生的。方法運行過程中如果產生了異常,在這個方法中就生成一個代表該異常類的對象,并把它交給運行時系統,運行時系統尋找相應的代碼來處理該異常。這個過程稱為拋出異常。運行時系統在方法的調用棧中查找,從產生異常的方法開始進行回溯,直到找到包含相應異常處理的方法為止,這一過程稱為捕獲異常。假如在methodC()方法發生異常9.2.1異常的拋出與捕獲捕獲并處理異常最常用的方法是用try-catch-finally語句,一般格式為:try{//需要處理的代碼}catch(ExceptionType1exceptionObject){//異常處理代碼}[catch(ExceptionType2exceptionObject){//異常處理代碼}finally{//最后處理代碼}]9.2.2try-catch-finally語句try塊將程序中可能產生異常的代碼段用大括號括起來,該塊內可能拋出一種或多種異常。catch塊用來捕獲異常,括號中指明捕獲的異常類型及異常引用名,類似于方法的參數,它指明了catch語句所處理的異常。大括號中是處理異常的代碼。catch語句可以有多個,用來處理不同類型的異常。finally塊是可選項。異常的產生往往會中斷應用程序的執行,而在異常產生前,可能有些資源未被釋放。有時無論程序是否發生異常,都要執行一段代碼,這時就可以通過finally塊實現。無論異常產生與否finally塊都會被執行。inta=5;try{intb=a/0;System.out.println("b="+b);}catch(ArithmeticExceptione){e.printStackTrace();}System.out.println("a="+a);//異常處理后程序繼續執行程序9.2DivideDemo.java該行產生異常程序中調用了異常對象的printStackTrace()方法,它從控制臺輸出異常棧跟蹤。從棧跟蹤中我們可以了解到發生的異常類型和發生異常的源代碼的行號。在異常類的根類Throwable中還定義了其他方法,如下所示:publicvoidprintStackTrace():在標準錯誤輸出流上輸出異常調用棧的軌跡。publicStringgetMessage():返回異常對象的細節描述。publicvoidprintStackTrace(PrintWriters):在指定輸出流上輸出異常調用棧的軌跡。publicStringtoString():返回異常對象的簡短描述,是Object類中同名方法的覆蓋。異常類的方法publicclassInputCharDemo{publicstaticvoidmain(String[]args){System.out.print("請輸入一個字符:");try{charc=(char)System.in.read();System.out.println("c="+c);}catch(IOExceptione){System.out.println(e);}}程序9.3InputCharDemo.javatry{if(value==0){System.out.println("無異常發生.");return;}elseif(value==1){inti=0;System.out.println(4/i);}elseif(value==2){intiArray[]=newint[4];iArray[4]=10;}程序9.4MultiExceptionDemo.java}catch(ArithmeticExceptione){System.out.println("捕獲到:"+e.toString());}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("捕獲到:"+e.toString());}catch(Exceptione){System.out.println("Willnotbeexcecuted");}finally{System.out.println("執行finally塊:"+value);}}publicstaticvoidmain(String[]args){method(0);method(1);method(2);}面向對象程序設計9.3捕獲多個異常如果在多個catch塊捕獲的異常使用相同的代碼處理,則可以僅用一個catch塊處理,而不必單獨捕獲每個異常,這就減少了代碼重復。捕獲多個異常要在一個catch語句中處理多個異常,需要使用“或”運算符(|)分隔多個異常。inta=88,b=0;intresult;char[]letter={'A','B','C'};for(inti=0;i<2;i++){try{if(i==0)result=a/b;elseletter[5]='X';}程序9.5MultiCatchDemo.javacatch(ArithmeticException|ArrayIndexOutOfBoundsExceptionme){System.out.println("捕獲到異常:"+me);}程序運行當嘗試除以0時,將產生一個ArithmeticException錯誤。當嘗試越界訪問letter數組時,將產生一個ArrayIndexOutOfException錯誤,兩個異常被同一個catch語句捕獲。注意,多重捕獲的每個形參隱含地為final,所以不能為其賦新值。面向對象程序設計9.4throws短語和throw語句所有的異常都產生在方法(包括構造方法)內部的語句。有時方法中產生的異常不需要在該方法中處理,可能需要由該方法的調用方法處理,這時可以在聲明方法時用throws子句聲明拋出異常,將異常傳遞給調用該方法的方法處理。聲明方法拋出異常的格式如下:throws短語returnTypemethodName([paramlist])throwsExceptionList{//方法體}聲明方法拋出異常到目前為止,處理的異常都是由程序產生的,并由程序自動拋出,然而也可以創建一個異常對象,然后用throw語句拋出,或者將捕獲到的異常對象用throw語句再次拋出,throw語句的格式如下:throw語句

throwexceptInstance;exceptInstance可以是用戶創建的異常對象,也可以是程序捕獲到的異常對象,該實例必須是Throwable類或其子類的實例,請看下面例子。publicstaticvoidmethod()throwsIOException{try{

thrownewIOException("文件未找到");}catch(IOExceptione){ System.out.println("捕獲到異常");

throwe;}}程序9.7ThrowExceptionDemo.java拋出一個異常拋出捕獲的異常publicstaticvoidmain(String[]args){ try{ method(); }catch(IOExceptione){ System.out.println("再次捕獲:"+e); }}面向對象程序設計9.5try-with-resources語句Java程序中經常需要創建一些對象(如I/O流、數據庫連接),這些對象在使用完后需要關閉。忘記關閉這些對象可能導致內存泄露,并引起其他問題。在JDK7之前,通常使用finally語句來確保一定會調用close()方法:概述try{//打開資源}catch(Exceptione){//處理異常}finally{//關閉資源}如果在調用close()方法也可能拋出異常,那么也要處理這種異常。這樣編寫的程序代碼會變得冗長。例如,下面是打開一個數據庫連接的典型代碼:Connectionconnection=null;try{//創建連接對象并執行操作}catch(Exceptione){//處理異常}finally{if(connection!=null){try{connection.close();}catch(SQLExceptione){//處理異常}}}冗長乏味的代碼JDK7提供的自動關閉資源的功能為管理資源(如文件流、數據庫連接等)提供了一種更加簡便的方式。這種功能是通過一種新的try語句實現的,叫try-with-resources,有時稱為自動資源管理。try-with-resources的主要好處是可以避免在資源(如文件流)不需要時忘記將其關閉。try-with-resources語句try-with-resources語句的基本形式如下:try(resource-specification){//使用資源}[catch(Exceptione){//處理異常}]try-with-resources語句控制離開try塊后,創建的資源將自動調用close()方法關閉,代碼簡潔catch塊是可選的Java9增強了try-with-resources語句的功能,允許在try塊外部創建資源對象,然后在try-with-resources語句中使用這些對象。示例如下:try-with-resources語句并非所有的資源都可以自動關閉。只有實現了java.lang.AutoCloseable接口的那些資源才可自動關閉。該接口是Java7新增的,它定義了close()方法。java.io.Closeable接口繼承了AutoCloseable接口。這兩個接口被所有的I/O流類實現,包括FileInputStream和FileOutputStream。因此,在使用I/O流(包括文件流)時,可以使用try-with-resources語句。publicvoidmethod(Connectionconn,ResultSetrs){try(conn;rs){while(rs.next()){//處理檢索的數據}}catch(SQLExceptionex){//執行某種操作//異常可能由不正確的SQL語句引起}}面向對象程序設計9.6自定義異常類盡管Java已經預定義了許多異常類,但有時還需要定義自己的異常。編寫自定義異常類實際上是繼承一個API標準異常類,用新定義的異常處理信息覆蓋原有信息的過程。常用的編寫自定義異常類的模式如下:自定義異常類publicclassCustomExceptionextendsException{

publicCustomException(){}

publicCustomException(Stringmessage){

super(message);

}}packagecom.boda.xy;publicclassNegativeValueExceptionextendsException{publicNegativeValueException()

{}

publicNegativeValueException(Stringmessage){

super(message);

}}有了上述自定義異常,我們在程序中就可以使用它。假設編寫程序要求用戶輸入圓半徑,計算圓面積。該程序要求半徑值應該為正值。程序代碼如下。程序9.9NegativeValueException.javavarinput=newScanner(System.in);varradius=0.0;vararea=0.0;System.out.print("請輸入半徑值:");try{radius=input.nextDouble();if(radius<0){thrownewNegativeValueException("半徑值不能小于0。");}else{area=Math.PI*radius*radius;System.out.println("圓的面積是:"+area);}}catch(NegativeValueExceptionnve){System.out.println(nve.getMessage());}程序9.10CustomExceptionDemo.java面向對象程序設計9.7案例:數組不匹配異常有一個名為com.boda.xy.ArrayUtils的實用工具類,該類有一個名為addArray的靜態方法,用于對兩個長度相同的數組相加。addArray的簽名如下:publicstaticlong[]addArray(int[]

array1,int[]array2)throwsMismatchedArrayException,NullPointerException

問題描述如果兩個參數的長度不相同(比如,一個長度是3,一個長度是5),方法拋出一個自定義異常MismatchedArrayException,要求該異常類的toString方法必須返回下面這個值:

數組大小不同。第一個數組大小是3,第二個數組大小是5.如果其中一個數組為null,該方法將拋出NullPointerException異常。編程測試產生這兩種異常的情形。(1)由于MismatchedArrayException異常只在addArray靜態方法中使用,所以這里可將該類定義為外層類ArrayUtils類的靜態內部類。(2)為MismatchedArrayException類定義一個帶兩個參數的構造方法,因為拋出該異常對象時要傳遞兩個數組的大小。(3)覆蓋MismatchedArrayException類的toString()方法輸出異常信息。(4)在addArray()方法中,當兩個數組大小不相等時,使用throw語句拋出創建的MismatchedArrayException對象。設計思路publicstaticclassMismatchedArrayExceptionextendsException{intx=0,y=0;publicMismatchedArrayException(intx,inty){this.x=x;this.y=y;}@OverridepublicStringtoString(){ return"數組大小不同。第一個數組大小是"+x+",第二個數組大小是"+y+"."; }}程序10.12ArrayUtils.javapublicstaticlong[]addArray(int[]array1,int[]array2) throwsMismatched

溫馨提示

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

評論

0/150

提交評論