溫馨提示×

溫馨提示×

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

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

Java異常----try、catch和finally塊中的return執(zhí)行順序

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

1.當(dāng)Java程序執(zhí)行try塊、catch塊時(shí)遇到return語句,return語句會導(dǎo)致該方法立即結(jié)束。系統(tǒng)執(zhí)行完return語句之后,并不會立即結(jié)束該方法,而是去尋找該異常處理流程中是否包含finally塊,若沒有finally塊,則方法終止,返回相應(yīng)的返回值;


若有finally塊,則立即開始執(zhí)行finally塊,此時(shí)若finally塊中沒有return語句,則系統(tǒng)才會再次跳回來根據(jù)try塊或catch塊中的return語句結(jié)束方法(但是,不會再次執(zhí)行return語句體,還是第一次執(zhí)行的那個(gè)結(jié)果);若finally塊中有return語句,則finally塊已經(jīng)結(jié)束了方法,系統(tǒng)不會跳回去執(zhí)行try塊或catch塊里的任何代碼。


沒有finally塊的比較簡單,這里只看有finally塊的,看如下代碼:


[java] view plaincopy


package com.mys.test;??

??

public class Test {??

??

? ? /**?

? ? ?* @param args?

? ? ?*/??

? ? public static void main(String[] args) {??

? ? ? ? Test test = new Test();??

? ? ? ? int a = 0;??

? ? ? ? try {??

? ? ? ? ? ? a = test.test();??

? ? ? ? } catch (Exception e) {??

? ? ? ? ? ? // TODO Auto-generated catch block??

? ? ? ? ? ? e.printStackTrace();??

? ? ? ? }??

? ? ? ? System.out.println("調(diào)用test()后a="+a);??

? ? ? ? ??

? ? }??

??

? ? @SuppressWarnings("finally")??

? ? private int test()throws Exception {??

? ? ? ? int count = 5;??

? ? ? ? try{??

? ? ? ? ? ? System.out.println("try塊,count="+count);??

? ? ? ? ? ? return ++count;//main()中輸出6??

//? ? ? ? ? return count++;//main()中輸出5??

? ? ? ? }finally{??

? ? ? ? ? ? count=100000;??

? ? ? ? ? ? System.out.println("finally塊,count++="+count++ +"? ,count="+count);??

? ? ? ? }??

? ? }??

??

}??

第一種finally塊中沒有return語句,則上面代碼輸入如下:

try塊,count=5

finally塊,count++=100000? ,count=100001

調(diào)用test()后a=6


其中調(diào)用test()后a=6就說明了執(zhí)行完finally塊后代碼雖然立刻返回了,但不會再次執(zhí)行try或catch塊中的return語句體,還是第一次執(zhí)行的那個(gè)結(jié)果(由局部變量決定的)


[java] view plaincopy


<span >package com.mys.test;??

??

public class Test {??

??

? ? /**?

? ? ?* @param args?

? ? ?*/??

? ? public static void main(String[] args) {??

? ? ? ? Test test = new Test();??

? ? ? ? int a = 0;??

? ? ? ? try {??

? ? ? ? ? ? a = test.test();??

? ? ? ? } catch (Exception e) {??

? ? ? ? ? ? // TODO Auto-generated catch block??

? ? ? ? ? ? e.printStackTrace();??

? ? ? ? }??

? ? ? ? System.out.println("調(diào)用test()后a="+a);??

? ? ? ? ??

? ? }??

??

? ? @SuppressWarnings("finally")??

? ? private int test()throws Exception {??

? ? ? ? int count = 5;??

? ? ? ? try{??

? ? ? ? ? ? System.out.println("try塊,count="+count);??

? ? ? ? ? ? return ++count;??

? ? ? ? }finally{??

? ? ? ? ? ? count=100000;??

? ? ? ? ? ? System.out.println("finally塊,count++="+count++ +"? ,count="+count);??

? ? ? ? ? ? return ++count;??

? ? ? ? }??

? ? }??

??

}</span>??

第二種finally塊中有return語句,則上面代碼輸入如下:

try塊,count=5

finally塊,count++=100000? ,count=100001

調(diào)用test()后a=100002




2.再來看另一種情況,


[java] view plaincopy


package com.mys.test;??

??

public class Test {??

??

? ? /**?

? ? ?* @param args?

? ? ?*/??

? ? public static void main(String[] args) {??

? ? ? ? Test test = new Test();??

? ? ? ? int a = 0;??

? ? ? ? try {??

? ? ? ? ? ? a = test.test();??

? ? ? ? } catch (Exception e) {??

? ? ? ? ? ? // TODO Auto-generated catch block??

? ? ? ? ? ? e.printStackTrace();??

? ? ? ? }??

? ? ? ? System.out.println("調(diào)用test()后a="+a);??

? ? ? ? ??

? ? }??

??

? ? @SuppressWarnings("finally")??

? ? private int test(){??

? ? ? ? int count = 5;??

? ? ? ? try{??

? ? ? ? ? ? System.out.println("try塊,count="+count);??

? ? ? ? ? ? throw new RuntimeException("測試異常");??

? ? ? ? }finally{??

? ? ? ? ? ? count=100000;??

? ? ? ? ? ? System.out.println("finally塊,count++="+count++ +"? ,count="+count);??

? ? ? ? ? ? return ++count;??

? ? ? ? }??

? ? }??

??

}??

上面代碼輸入如下:

try塊,count=5

finally塊,count++=100000? ,count=100001

調(diào)用test()后a=100002

try塊中拋出了RuntimeException異常,同時(shí)程序中并未使用catch塊來捕獲這個(gè)異常,正常情況下,該異常應(yīng)導(dǎo)致test()方法非正常終止,test()應(yīng)該沒有返回值。但實(shí)際情況是,test()完全可以正常結(jié)束.這也符合finally塊執(zhí)行的流程:


當(dāng)程序執(zhí)行try塊、catch塊時(shí)遇到throw語句,throw語句會導(dǎo)致該方法立即結(jié)束。系統(tǒng)執(zhí)行完throw語句之后,并不會立即結(jié)束該方法,而是去尋找該異常處理流程中是否包含finally塊,若沒有finally塊,則程序立即拋出異常;


若有finally塊,則立即開始執(zhí)行finally塊,此時(shí)若finally塊中沒有return語句,則系統(tǒng)才會再次跳回來拋出異常;若finally塊中有return語句,則finally塊已經(jīng)結(jié)束了方法,系統(tǒng)不會跳回去執(zhí)行try塊或catch塊去拋出異常。


由于上面的例子是使用的RuntimeException異常,該異常屬于非受查異常,編譯器不要求強(qiáng)制處置的異常

(強(qiáng)制處理的需要用try...catch...或者往上拋出(test() throws Exception),所以,能夠正常輸出.


即沒有異常,如果,把 上例中finally塊中的return ++count;去掉就會拋出異常了?。。?/p>


向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