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