標籤:
Java程式運行過程中所發生的例外狀況事件可分為兩類:
§錯誤(Error):JVM系統內部錯誤、資源耗盡等嚴重情況§違例(Exception): 其它因編程錯誤或偶然的外在因素導致的一般性問題,例如: –對負數開平方根 –null 指標訪問 –試圖讀取不存在的檔案 –網路連接中斷例:
public class ExceptionTest01{ public static void main(String[] args) { String friends[]={"lisa","bily","kessy"}; for(int i=0;i<5;i++) { System.out.println(friends[i]); } System.out.println("\nthis is the end"); }}
public class ExceptionTest02 { public static void main(String[] args){ String user[] = {"lilei","lucy","lisa"}; try{ for(int i=0; i<5; i++) { System.out.println(user[i]); } }catch(java.lang.ArrayIndexOutOfBoundsException e){ System.out.println("異常:" + e.getMessage()); } System.out.println("程式結束!"); } }
異常處理塊的一般形式
try{ // 要監控錯誤的代碼塊 methodGeneratingException();} catch (Exception e) { // Exception e 的例外處理常式} finally{ // 在 try 結束前要執行的代碼塊 cleanup();}
•Throwable 具有兩個子類,它們是–Exception:處理使用者程式應當捕獲的異常情況–Error:Error 類的異常為內部錯誤,因此在正常情況下不期望使用者的程式捕獲它們
常見 異常類
§RuntimeException–錯誤的類型轉換–數組下標越界–null 指標訪問§IOExeption–從一個不存在的檔案中讀取資料–越過檔案結尾繼續讀取–串連一個不存在的URL
捕獲異常
捕獲異常是通過try-catch-finally語句實現的。
try{ ...... //可能產生異常的代碼}catch( ExceptionName1 e ){ ...... //當產生ExceptionName1型異常時的處置措施}catch( ExceptionName2 e ){...... //當產生ExceptionName2型異常時的處置措施} {finally{...... //無條件執行的語句 } }
§try
捕獲異常的第一步是用try{…}語句塊選定捕獲異常的範圍。
§catch
在catch語句塊中是對異常對象進行處理的代碼,每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同類型的異常對象。與其它對象一樣,可以訪問一個異常對象的成員變數或調用它的方法。
–getMessage( ) 方法,用來得到有關例外狀況事件的資訊–printStackTrace( )用來跟蹤例外狀況事件發生時執行堆棧的內容。當使用多重catch的時候 越外面的 層級越高 如:
try { …… } catch(ClassCastException ex){ …… } catch(NumberFormatException ex){ …… } catch(Exception ex){ …… } // 此句必須放在最後!
§finally–捕獲異常的最後一步是通過finally語句為異常處理提供一個統一的出口,使得在控制流程轉到程式的其它部分以前,能夠對程式的狀態作統一的管理。不論在try代碼塊中是否發生了例外狀況事件,finally塊中的語句都會被執行。–finally語句是任選的
try { startFaucet(); waterLawn(); } catch (BrokenPipeException e){ logProblem(); } finally { stopFaucet(); }
聲明拋棄異常
§聲明拋棄異常是Java中處理異常的第二種方式–如果一個方法(中的語句執行時)可能產生某種異常,但是並不能確定如何處理這種異常,則此方法應聲明拋棄異常,表明該方法將不對這些異常進行處理,而由該方法的調用者負責處理
public void readFile(String file) throws IOException { …… // 讀檔案的操作可能產生IOException類型的異常 FileInputStream fis = new FileInputStream(file); ..…… }
重寫方法聲明拋棄異常原則
•重寫方法不能拋出比被重寫方法範圍更大的異常類型
public class A { public void methodA() throws IOException { …… } } public class B1 extends TestA { public void methodA() throws FileNotFoundException { …… } } public class B2 extends TestA { public void methodA() throws Exception { …… } }
人工拋出異常
§Java異常類對象除在程式執行過程中出現異常時
由系統自動生成並拋出,也可根據需
要人工建立並拋出–首先要產生異常對象,然後通過throw語句實現拋出操作(提交給Java運行環境)。
IOException e =new IOException();
throw e;
–可以拋出的異常必須是Throwable或其子類的執行個體。下面的語句在編譯時間將會產生語法錯誤:
throw new String("want to throw");
•使用者自訂異常類MyException,用於描述資料取值範圍錯誤資訊:
class MyException extends Exception { private int idnumber; public MyException(String message, int id) { super(message); this.idnumber = id; } public int getId() { return idnumber; }}
使用者自訂異常類
public class ExceptionTest05{ public void regist(int num) throws MyException { if (num < 0) { throw new MyException("人數為負值,不合理",3); } System.out.println("登記人數" + num); } public void manager() { try { regist(100); } catch (MyException e) { System.out.print("登記失敗,出錯種類"+e.getId())); } System.out.print("本次登記操作結束"); } public static void main(String args[]){ ExceptionTest05 t = new ExceptionTest05(); t.manager(); }}
•異常是運行時發生的錯誤•可以使用 try、catch、throw、throws 和 finally 來管理 Java 異常處理。要監控的程式語句包含在 try 塊內catch 塊中的代碼用於捕獲和處理異常。在方法返回之前絕對必須執行的代碼應放置在 finally 塊中•要手動引發異常,使用關鍵字 throw。任何被拋到方法外部的異常都必須用 throws 子句指定•多重catch 和嵌套try-catch的使用•自訂異常的編寫和使用
Java 異常處理筆記