程序運行過程中可能會出現異常情況,比如被0除、對負數計算平方根等,還有可能會出現致命的錯誤,比如內存不足,磁盤損壞無法讀取文件等,對於異常和錯誤情況的處理,統稱為異常處理。
Java異常處理主要通過5個關鍵字控制:try、catch、throw、throws和finally。try的意思是試試它所包含的代碼段中是否會 發生異常;而catch當有異常時抓住它,並進行相應的處理,使程序不受異常的影響而繼續執行下去;throw是在程序中明確引發異常;throws的作 用是如果一個方法可以引發異常,而它本身並不對該異常處理,那么它必須將這個異常拋給調用它的方法;finally是無論發不發生異常都要被執行的代碼
關鍵字:throw,throws,try和catch的用法如下:
1、throws出現在方法的聲明中,表示該方法可能會拋出的異常,允許throws后面跟着多個異常類型
2、throw出現在方法體中,用於拋出異常。當方法在執行過程中遇到異常情況時,將異常信息封裝為異常對象,然后throw。
3、try出現在方法體中,它自身是一個代碼塊,表示嘗試執行代碼塊的語句。如果在執行過程中有某條語句拋出異常,那么代碼塊后面的語句將不被執行。
4、catch出現在try代碼塊的后面,自身也是一個代碼塊,用於捕獲異常try代碼塊中可能拋出的異常。catch關鍵字后面緊接着它能捕獲的異常類型,所有異常類型的子類異常也能被捕獲。
演示實例
1 package book.exception; 2 /** 3 * 拋出異常和聲明異常 4 * @author joe 5 * 6 */ 7 8 public class ThrowAndThrows { 9 /** 10 * 計算一個數字的平方根 11 * @param nStr 以字符串的形式提供數字 12 * @return 返回平方根 13 * @throws Exception 當用戶輸入的字符串為空, 14 * 或者字符串無法轉換成數字,或者轉換成的數字小於0,都會拋出異常 15 */ 16 public static double sqrt(String nStr) throws Exception { 17 if (nStr == null) { 18 //用trow關鍵字拋出異常,當異常被拋出時,程序會跳出該方法 19 throw new Exception("輸入的字符不能為空!"); 20 } 21 double n = 0; 22 try { 23 n = Double.parseDouble(nStr); 24 } catch(NumberFormatException e) { 25 //將parseDouble方法可能拋出的異常NumberFormatException捕獲, 26 //然后將捕獲的異常重新封裝並輸出 27 throw new Exception("輸入的字符串必須能夠轉化成數字!", e); 28 } 29 if (n < 0 ){ 30 throw new Exception("輸入的字符串轉化成的數字必須大於0!"); 31 } 32 return Math.sqrt(n); 33 } 34 35 public static void main(String[] args) throws Exception { 36 try{ 37 ThrowAndThrows.sqrt("-124.56"); 38 } catch(Exception e) { 39 //將sqrt方法聲明的可能拋出的Exception異常捕獲 40 //打印捕獲的異常的堆棧信息,從堆棧信息中可以發現異常發生的位置和原因 41 System.out.println("Got a Exception:" + e.getMessage()); 42 e.printStackTrace(); 43 throw e; //不做進一步處理,將異常向外拋出 44 } 45 46 //將sqrt聲明了可能會拋出的異常向外拋出,必須在方法聲明中使用throws 47 ThrowAndThrows.sqrt("-124.56"); 48 } 49 50 }
程序輸出結果:
1 Got a Exception:輸入的字符串轉化成的數字必須大於0! 2 java.lang.Exception: 輸入的字符串轉化成的數字必須大於0! 3 at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30) 4 at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37) 5 Exception in thread "main" java.lang.Exception: 輸入的字符串轉化成的數字必須大於0! 6 at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30) 7 at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)
源碼分析:
在main方法里,由於sqrt方法的聲明中有throws關鍵字,所以,在調用該方法時,必須對throws后面聲明的異常進行處置,處置的方法有兩種:
(1)main方法處理該異常,使用try.....catch語句,將可能會出現的異常的代碼放在try塊內,將處理異常的代碼放在catch塊內,並指明catch能夠捕獲的異常的類型,當異常被捕獲時,執行catch塊內的語句。
(2)main方法不處理該異常,將異常向外層程序拋出。在方法聲明中使用throws關鍵字拋出異常,方法體中不需要使用try...catch語句。
異常類Exception的getMessage方法用來獲取一場的描述信息,printStackTrace方法用來打印異常的堆棧信息,通過堆棧信息能夠查明異常發生的原因和位置,在調試的時候常用。
轉載自:http://blog.csdn.net/zhouyong80/article/details/1907799
