您好,登錄后才能下訂單哦!
Java異常處理通過5個(gè)關(guān)鍵字try、catch、throw、throws、finally進(jìn)行管理。
基本過程是用try語句塊包住要監(jiān)視的語句,如果在try語句塊內(nèi)出現(xiàn)異常,則異常會(huì)被拋出,
你的代碼在catch語句塊中可以捕獲到這個(gè)異常并做處理;還有以部分系統(tǒng)生成的異常在Java運(yùn)行時(shí)自動(dòng)拋出。
你也可以通過throws關(guān)鍵字在方法上聲明該方法要拋出異常,然后在方法內(nèi)部通過throw拋出異常對象。
?對于可能出現(xiàn)異常的代碼,有兩種處理辦法:
第一、在方法中用try...catch語句捕獲并處理異常,catch語句可以有多個(gè),用來匹配多個(gè)異常。例如:
public void p(int x){
?try{
? ...
?}catch(Exception e){
? ...
?}finally{
? ...
?}
}
?
第二、對于處理不了的異常或者要轉(zhuǎn)型的異常,在方法的聲明處通過throws語句拋出異常。例如:
public void test1() throws MyException{
?...
?if(....){
? throw new MyException();
?}
}?
---------------------------------------------------------------------------------------------------------------------------------------
finally語句塊會(huì)在方法執(zhí)行return之前執(zhí)行,
package test;
?
public class Test {
?
?/**
? * @param args
? * @throws Exception?
? */
?public static void main(String[] args) throws Exception {??
? System.out.println(Test.test());
?}
?
?public static boolean test(){
? boolean flag = true;
? System.out.println("Hello World!!!");?
? ? ?try{?
? ? ? System.out.println(1/0); //第一種情況
?
? ? ? System.out.println(1/1); //第2種情況
? ? ? flag = false;
? ? ?}catch(ArithmeticException e){?
? ? ? System.out.println("除數(shù)為0!");?
? ? ? throw e;
? ? ?}finally{
? ? ? System.out.println("finally中的語句");
? ? ?}
? ? ?return flag;
?}
?
}
執(zhí)行結(jié)果:
//第一種情況
Hello World!!!
Exception in thread "main" java.lang.ArithmeticException: / by zero
?at test.Test.test(Test.java:46)
?at test.Test.main(Test.java:37)
除數(shù)為0!
finally中的語句
//第二種情況
Hello World!!!
1
finally中的語句
false
-----------------------------------------------------------------------------------------------------------------------------
如果每個(gè)方法都是簡單的拋出異常,那么在方法調(diào)用方法的多層嵌套調(diào)用中,Java虛擬機(jī)會(huì)從出現(xiàn)異常的方法代碼塊中往回找,
直到找到處理該異常的代碼塊為止。然后將異常交給相應(yīng)的catch語句處理。如果Java虛擬機(jī)追溯到方法調(diào)用棧最底部main()方法時(shí),
如果仍然沒有找到處理異常的代碼塊,將按照下面的步驟處理:
? ? ? ? 第一、調(diào)用異常的對象的printStackTrace()方法,打印方法調(diào)用棧的異常信息。
? ? ? ? 第二、如果出現(xiàn)異常的線程為主線程,則整個(gè)程序運(yùn)行終止;如果非主線程,則終止該線程,其他線程繼續(xù)運(yùn)行。
? ? ? ? 通過分析思考可以看出,越早處理異常消耗的資源和時(shí)間越小,產(chǎn)生影響的范圍也越小。因此,不要把自己能處理的異常也拋給調(diào)用者。
? ? ? ? 還有一點(diǎn),不可忽視:finally語句在任何情況下都必須執(zhí)行的代碼,這樣可以保證一些在任何情況下都必須執(zhí)行代碼的可靠性。
比如,在數(shù)據(jù)庫查詢異常的時(shí)候,應(yīng)該釋放JDBC連接等等。finally語句先于return語句執(zhí)行,而不論其先后位置,也不管是否try塊出現(xiàn)異常。
finally語句唯一不被執(zhí)行的情況是方法執(zhí)行了System.exit()方法。System.exit()的作用是終止當(dāng)前正在運(yùn)行的 Java 虛擬機(jī)。
finally語句塊中不能通過給變量賦新值來改變r(jià)eturn的返回值,也建議不要在finally塊中使用return語句,沒有意義還容易導(dǎo)致錯(cuò)誤。
? ? ? ? 最后還應(yīng)該注意一下異常處理的語法規(guī)則:
? ? ? ? 第一、try語句不能單獨(dú)存在,可以和catch、finally組成 try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語句可以有一個(gè)或多個(gè),
finally語句最多一個(gè),try、catch、finally這三個(gè)關(guān)鍵字均不能單獨(dú)使用。
? ? ? ? 第二、try、catch、finally三個(gè)代碼塊中變量的作用域分別獨(dú)立而不能相互訪問。如果要在三個(gè)塊中都可以訪問,則需要將變量定義到這些塊的外面。
? ? ? ? 第三、多個(gè)catch塊時(shí)候,Java虛擬機(jī)會(huì)匹配其中一個(gè)異常類或其子類,就執(zhí)行這個(gè)catch塊,而不會(huì)再執(zhí)行別的catch塊。
? ? ? ? 第四、throw語句后不允許有緊跟其他語句,因?yàn)檫@些沒有機(jī)會(huì)執(zhí)行。
? ? ? ? 第五、如果一個(gè)方法調(diào)用了另外一個(gè)聲明拋出異常的方法,那么這個(gè)方法要么處理異常,要么聲明拋出。?
? ? ? ? 那怎么判斷一個(gè)方法可能會(huì)出現(xiàn)異常呢?一般來說,方法聲明的時(shí)候用了throws語句,方法中有throw語句,方法調(diào)用的方法聲明有throws關(guān)鍵字。
? ? ? ? throw和throws關(guān)鍵字的區(qū)別
? ? ? ? throw用來拋出一個(gè)異常,在方法體內(nèi)。語法格式為:throw 異常對象。
? ? ? ? throws用來聲明方法可能會(huì)拋出什么異常,在方法名后,語法格式為:throws 異常類型1,異常類型2...異常類型n。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。