1. 程式人生 > >java異常處理之throw, throws,try和catch

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關鍵字後面緊接著它能捕獲的異常型別,所有異常型別的子類異常也能被捕獲。
       
    演示例項

package book.exception;
/**
 * 丟擲異常和宣告異常
 * 
@author joe
 *
 
*/


publicclass ThrowAndThrows {
    
/**
     * 計算一個數字的平方根
     * 
@param nStr    以字串的形式提供數字
     * 
@return    返回平方根
     * 
@throws Exception    當用戶輸入的字串為空,
     * 或者字串無法轉換成數字,或者轉換成的數字小於0,都會丟擲異常
     
*/

    
publicstaticdouble sqrt(String nStr) throws
 Exception {
        
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方法用來列印異常的堆疊資訊,通過堆疊資訊能夠查明異常發生的原因和位置,在除錯的時候常用。