日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

try-catch-finally的执行顺序

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 try-catch-finally的执行顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

try-catch-finally的執行順序

結論:

  • 不管有沒有出現異常,finally代碼塊都會執行;
  • 不管try和catch的代碼塊中有return時,finally仍會執行,且如果finally代碼塊也有return,則此代碼肯定會返回finally執行的return值。
  • 分有return和沒有return來討論try-catch-finally執行順序的情況:

    1 無return

    舉個例子:

    try {t();tt(); } catch (Exception e) {c(); } finally {f(); } m();

    1.1 當try中的t()沒有拋出異常
    因為沒有捕捉到異常,那么執行try而不會執行catch,而finally無論如何都要執行。
    其執行順序為:t() --> tt() --> f() --> m()

    1.2 當try中的t()拋出了異常
    當 t() 中拋出異常,那么 t() 中從拋出異常的語句之后的代碼以及 tt() 都不會執行, 程序會嘗試捕捉異常。
    捕捉Exception,捕捉成功,執行 c() ;
    一旦捕捉到一個異常,不會再嘗試捕捉其他異常,直接執行finally里的f();
    執行后面的函數 m() 。
    其執行順序為:t() --> c() --> f() --> m()

    2 有return

    2.1

    try{} catch(){} finally{} return;

    程序按順序執行

    2.2 try塊中有return

    try{return 1;} catch(){} finally{} return 2;

    程序執行try塊中return之前(包括return語句中的表達式運算)代碼;
    再執行finally塊,最后執行try中return;
    finally塊之后的語句return不再執行,因為程序在try中已經return過了。
    結論:得到try中的返回值1。

    2.3 catch塊中有return

    try{} catch(){return 1;} finally{} return 2;

    程序先執行try,如果遇到異常執行catch塊,

    • 有異常:執行catch中return之前(包括return語句中的表達式運算)代碼,再執行finally語句中全部代碼,最后執行catch塊中return。 finally之后的return不再執行。
    • 無異常:執行完try再finally再return。

    結論:有異常影響catch,執行catch中的return得到返回值1。
    2.4 try塊和finally塊中有return

    try{return 1;} catch(){} finally{return 2;}
    • 無異常:程序執行try塊中return之前(包括return語句中的表達式運算)代碼;再執行finally塊,因為finally塊中有return所以提前退出,而不再執行try中的return;
    • 有異常:不執行try,順序執行catch-finally

    結論:得到finally中的返回值2。

    2.5 catch塊和finally塊中有return

    try{} catch(){return 1;} finally{return 2;}
    • 無異常:執行try后跳過catch執行finally;得到finally的返回值2;
    • 有異常:程序執行catch塊中return之前(包括return語句中的表達式運算)代碼;再執行finally塊,因為finally塊中有return所以提前退出。而不再執行catch中的return。

    結論:得到finally中的返回值2。

    2.6 try塊、catch塊和finally塊中有return

    try{return 1;} catch(){return 2;} finally{return 3;}

    程序執行try塊中return之前(包括return語句中的表達式運算)代碼;

    • 無異常:然后再執行finally塊,因為finally塊中有return所以提前退出。
    • 有異常:執行catch塊中return之前(包括return語句中的表達式運算)代碼;再執行finally塊,因為finally塊中有return所以提前退出。
      結論:得到finally中的返回值3。

    3 總結
    無return,無異常

    try ->finally

    無return,有異常

    try(未出現異常的前半段) -> catch ->finally

    try或catch中有return,無異常

    try -> finally ->return(try)

    try或catch中有return,有異常

    try(未出現異常的前半段) -> catch ->finally->return(catch)

    只要是finally中有return的情況
    不論有沒有異常,try或catch中有沒有return

    try/catch->return(finally)

    我們可以看出當finally中有return的時候,相當于此代碼肯定會返回該值。

    4. 補充

    public class ExceptionTest {int age;public static void main(String[] args) {System.out.println(test().age);}public static ExceptionTest test() {ExceptionTest test = new ExceptionTest();try {test.age = 10;return test;}catch (Exception e) {test.age = 20;return test;}finally {test = new ExceptionTest();test.age = 30;}} }

    輸出:10
    當 try-catch 塊中有return 語句時,return 語句會暫存變量值,然后執行 finally 代碼塊。

    總結:
    1、不管有沒有出現異常,finally塊中代碼都會執行;
    2、當try和catch中有return時,finally仍然會執行;
    3、finally是在return后面的表達式運算后執行的(此時并沒有返回運算后的值,而是先把要返回的值保存起來,不管finally中的代碼怎么樣,返回的值都不會改變,仍然是之前保存的值),所以函數返回值是在finally執行前確定的;
    4、finally中最好不要包含return,否則程序會提前退出,返回值不是try或catch中保存的返回值。 最終結論:任何執行try 或者catch中的return語句之前,都會先執行finally語句,如果finally存在的話。 如果finally中有return語句,那么程序就return了,所以finally中的return是一定會被return的, 編譯器把finally中的return實現為一個warning。

    總結

    以上是生活随笔為你收集整理的try-catch-finally的执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。