溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java異常處理---finally和return的執(zhí)行順序

發(fā)布時(shí)間:2020-07-17 04:10:22 來源:網(wǎng)絡(luò) 閱讀:433 作者:沙漏半杯 欄目:編程語言

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。



向AI問一下細(xì)節(jié)

免責(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)容。

AI