java異常處理之throw, throws,try和catch
程式執行過程中可能會出現異常情況,比如被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關鍵字後面緊接著它能捕獲的異常型別,所有異常型別的子類異常也能被捕獲。
演示例項
/**
* 丟擲異常和宣告異常
* @author joe
*
*/
publicclass ThrowAndThrows {
/**
* 計算一個數字的平方根
* @param nStr 以字串的形式提供數字
* @return 返回平方根
* @throws Exception 當用戶輸入的字串為空,
* 或者字串無法轉換成數字,或者轉換成的數字小於0,都會丟擲異常
*/
publicstaticdouble sqrt(String nStr) throws
if (nStr ==null) {
//用trow關鍵字丟擲異常,當異常被丟擲時,程式會跳出該方法
thrownew Exception("輸入的字元不能為空!");
}
double n =0;
try{
n = Double.parseDouble(nStr);
}catch(NumberFormatException e) {
//將parseDouble方法可能丟擲的異常NumberFormatException捕獲,
thrownew Exception("輸入的字串必須能夠轉化成數字!", e);
}
if (n <0 ){
thrownew Exception("輸入的字串轉化成的數字必須大於0!");
}
return Math.sqrt(n);
}
publicstaticvoid main(String[] args) throws Exception {
try{
ThrowAndThrows.sqrt("-124.56");
}catch(Exception e) {
//將sqrt方法宣告的可能丟擲的Exception異常捕獲
//列印捕獲的異常的堆疊資訊,從堆疊資訊中可以發現異常發生的位置和原因
System.out.println("Got a Exception:"+ e.getMessage());
e.printStackTrace();
throw e; //不做進一步處理,將異常向外丟擲
}
//將sqrt聲明瞭可能會丟擲的異常向外丟擲,必須在方法宣告中使用throws
ThrowAndThrows.sqrt("-124.56");
}
}
程式輸出結果:
Got a Exception:輸入的字串轉化成的數字必須大於0!java.lang.Exception: 輸入的字串轉化成的數字必須大於0!
at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)
at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)
Exception in thread "main" java.lang.Exception: 輸入的字串轉化成的數字必須大於0!
at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)
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方法用來列印異常的堆疊資訊,通過堆疊資訊能夠查明異常發生的原因和位置,在除錯的時候常用。