java中try語句和throw的區(qū)別
java中try語句和throw的區(qū)別
在編程的時候往往會出現(xiàn)系統(tǒng)編譯時無法檢測到的錯誤,可是在運(yùn)行時會出錯,如果在可能出錯的地方拋出異常,那樣便嚴(yán)整了代碼的正確性.比如數(shù)組越界,分母為0,文件等。 編程中會用try語句和throw語句來對編程運(yùn)行過程中出現(xiàn)的異常情況進(jìn)行處理。那么這兩種有什么區(qū)別呢?下面小編帶你去了解一下。
Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)行分類,并提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當(dāng)一個方法出現(xiàn)異常后便拋出一個異常對象,該對象中包含有異常信息,調(diào)用這個對象的方法可以捕獲到這個異常并進(jìn)行處理。
Java的異常處理是通過5個關(guān)鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。
用try來指定一塊預(yù)防所有“異常”的程序。緊跟在try程序后面,應(yīng)包含一個catch子句來指定你想要捕捉的“異常”的類型。
throw語句用來明確地拋出一個“異常”。throws用來標(biāo)明一個成員函數(shù)可能拋出的各種“異常”。
Finally為確保一段代碼不管發(fā)生什么“異常”都被執(zhí)行一段代碼。可以在一個成員函數(shù)調(diào)用的外面寫一個try語句,在這個成員函數(shù)內(nèi)部寫另一個try語句保護(hù)其他代碼。
每當(dāng)遇到一個try語句,“異常”的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進(jìn)行處理,堆棧就會展開,直到遇到有處理這種“異常”的try語句。
try和throw的區(qū)別
try:出現(xiàn)在方法體中,它自身是一個代碼塊,表示嘗試執(zhí)行代碼塊的語句。如果在執(zhí)行過程中有某條語句拋出異常,那么代碼塊后面的語句將不被執(zhí)行。
throw:出現(xiàn)在方法體中,用于拋出異常。當(dāng)方法在執(zhí)行過程中遇到異常情況時,將異常信息封裝為異常對象,然后throw。
補(bǔ)充throws和catch語句
throws:出現(xiàn)在方法的聲明中,表示該方法可能會拋出的異常,允許throws后面跟著多個異常類型
catch:出現(xiàn)在try代碼塊的后面,自身也是一個代碼塊,用于捕獲異常try代碼塊中可能拋出的異常。catch關(guān)鍵字后面緊接著它能捕獲的異常類型,所有異常類型的子類異常也能被捕獲。
小編舉例
package book.exception;
/**
* 拋出異常和聲明異常
* @author joe
*
*/
public class ThrowAndThrows {
/**
* 計算一個數(shù)字的平方根
* @param nStr 以字符串的形式提供數(shù)字
* @return 返回平方根
* @throws Exception 當(dāng)用戶輸入的字符串為空,
* 或者字符串無法轉(zhuǎn)換成數(shù)字,或者轉(zhuǎn)換成的數(shù)字小于0,都會拋出異常
*/
public static double sqrt(String nStr) throws Exception {
if (nStr == null) {
//用trow關(guān)鍵字拋出異常,當(dāng)異常被拋出時,程序會跳出該方法
throw new Exception("輸入的字符不能為空!");
}
double n = 0;
try {
n = Double.parseDouble(nStr);
} catch(NumberFormatException e) {
//將parseDouble方法可能拋出的異常NumberFormatException捕獲,
//然后將捕獲的異常重新封裝并輸出
throw new Exception("輸入的字符串必須能夠轉(zhuǎn)化成數(shù)字!", e);
}
if (n < 0 ){
throw new Exception("輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!");
}
return Math.sqrt(n);
}
public static void main(String[] args) throws Exception {
try{
ThrowAndThrows.sqrt("-124.56");
} catch(Exception e) {
//將sqrt方法聲明的可能拋出的Exception異常捕獲
//打印捕獲的異常的堆棧信息,從堆棧信息中可以發(fā)現(xiàn)異常發(fā)生的位置和原因
System.out.println("Got a Exception:" + e.getMessage());
e.printStackTrace();
throw e; //不做進(jìn)一步處理,將異常向外拋出
}
//將sqrt聲明了可能會拋出的異常向外拋出,必須在方法聲明中使用throws
ThrowAndThrows.sqrt("-124.56");
}
}
程序輸出結(jié)果:
Got a Exception:輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!
java.lang.Exception: 輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!
at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)
at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)
Exception in thread "main" java.lang.Exception: 輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!
at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)
at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)
源碼分析:
在main方法里,由于sqrt方法的聲明中有throws關(guān)鍵字,所以,在調(diào)用該方法時,必須對throws后面聲明的異常進(jìn)行處置,處置的方法有兩種:
(1)main方法處理該異常,使用try.....catch語句,將可能會出現(xiàn)的異常的代碼放在try塊內(nèi),將處理異常的代碼放在catch塊內(nèi),并指明catch能夠捕獲的異常的類型,當(dāng)異常被捕獲時,執(zhí)行catch塊內(nèi)的語句。
(2)main方法不處理該異常,將異常向外層程序拋出。在方法聲明中使用throws關(guān)鍵字拋出異常,方法體中不需要使用try...catch語句。
異常類Exception的getMessage方法用來獲取一場的描述信息,printStackTrace方法用來打印異常的堆棧信息,通過堆棧信息能夠查明異常發(fā)生的原因和位置,在調(diào)試的時候常用。