您好,登錄后才能下訂單哦!
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>
免責(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)容。