您好,登錄后才能下訂單哦!
1.當Java程序執行try塊、catch塊時遇到return語句,return語句會導致該方法立即結束。系統執行完return語句之后,并不會立即結束該方法,而是去尋找該異常處理流程中是否包含finally塊,若沒有finally塊,則方法終止,返回相應的返回值;
若有finally塊,則立即開始執行finally塊,此時若finally塊中沒有return語句,則系統才會再次跳回來根據try塊或catch塊中的return語句結束方法(但是,不會再次執行return語句體,還是第一次執行的那個結果);若finally塊中有return語句,則finally塊已經結束了方法,系統不會跳回去執行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("調用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
調用test()后a=6
其中調用test()后a=6就說明了執行完finally塊后代碼雖然立刻返回了,但不會再次執行try或catch塊中的return語句體,還是第一次執行的那個結果(由局部變量決定的)
[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("調用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
調用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("調用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
調用test()后a=100002
try塊中拋出了RuntimeException異常,同時程序中并未使用catch塊來捕獲這個異常,正常情況下,該異常應導致test()方法非正常終止,test()應該沒有返回值。但實際情況是,test()完全可以正常結束.這也符合finally塊執行的流程:
當程序執行try塊、catch塊時遇到throw語句,throw語句會導致該方法立即結束。系統執行完throw語句之后,并不會立即結束該方法,而是去尋找該異常處理流程中是否包含finally塊,若沒有finally塊,則程序立即拋出異常;
若有finally塊,則立即開始執行finally塊,此時若finally塊中沒有return語句,則系統才會再次跳回來拋出異常;若finally塊中有return語句,則finally塊已經結束了方法,系統不會跳回去執行try塊或catch塊去拋出異常。
由于上面的例子是使用的RuntimeException異常,該異常屬于非受查異常,編譯器不要求強制處置的異常
(強制處理的需要用try...catch...或者往上拋出(test() throws Exception),所以,能夠正常輸出.
即沒有異常,如果,把 上例中finally塊中的return ++count;去掉就會拋出異常了!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。