<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-126  評論-247  文章-5  trackbacks-0

    前言:
    java 中的異常處理機制你真的理解了嗎?掌握了嗎?
    catch 體里遇到 return 是怎么處理? finally 體遇到 return 怎么辦?finally 體里有 System.exit() 方法怎么處理?當 catch 和 finally 體里同時遇上 return 怎么辦?

    相信你在處理異常的時候不是每次都把它 throws 掉就完事了,很多時候異常是需要我們自己來 catch 并針對所拋出的 Exception 做一些后續的處理工作。

    直接上代碼,先貼下面測試需要調用的方法:
     1
     2    // catch 后續處理工作
     3    public static boolean catchMethod() {
     4        System.out.print("call catchMethod and return  --->>  ");
     5        return false;
     6    }

     7    // finally后續處理工作
     8    public static void finallyMethod() {
     9        System.out.println();
    10        System.out.print("call finallyMethod and do something  --->>  ");
    11    }

    12


    1. 拋出 Exception,沒有 finally,當 catch 遇上 return
     1
     2public static boolean catchTest() {
     3        try {
     4            int i = 10 / 0;   // 拋出 Exception,后續處理被拒絕
     5            System.out.println("i vaule is : " + i);
     6            return true;    // Exception 已經拋出,沒有獲得被執行的機會
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return catchMethod();    // Exception 拋出,獲得了調用方法并返回方法值的機會
    10        }

    11    }

    12

    后臺輸出結果:
    1
    2 -- Exception --
    3call catchMethod and return  --->>  false
    4

    2. 拋出 Exception,當 catch 體里有 return,finally 體的代碼塊將在 catch 執行 return 之前被執行
     1
     2public static boolean catchFinallyTest1() {
     3        try {
     4            int i = 10 / 0// 拋出 Exception,后續處理被拒絕
     5            System.out.println("i vaule is : " + i);
     6            return true;   // Exception 已經拋出,沒有獲得被執行的機會
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return catchMethod();  // Exception 拋出,獲得了調用方法的機會,但方法值在 finally 執行完后才返回
    10        }
    finally{
    11            finallyMethod();  // Exception 拋出,finally 代碼塊將在 catch 執行 return 之前被執行
    12        }

    13    }

    14

    后臺輸出結果:
    1
    2 -- Exception --
    3call catchMethod and return  --->>  
    4call finallyMethod and do something  --->>  false
    5

    3. 不拋 Exception,當 finally 代碼塊里面遇上 return,finally 執行完后將結束整個方法
     1
     2public static boolean catchFinallyTest2() {
     3        try {
     4            int i = 10 / 2;  // 不拋出 Exception
     5            System.out.println("i vaule is : " + i);
     6            return true;   // 獲得被執行的機會,但執行需要在 finally 執行完成之后才能被執行
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return catchMethod();
    10        }
    finally{
    11            finallyMethod();
    12            return false// finally 中含有 return 語句,這個 return 將結束這個方法,不會在執行完之后再跳回 try 或 catch 繼續執行,方法到此結束,返回 false
    13        }

    14    }

    15

    后臺輸出結果:
    1
    2i vaule is : 5
    3
    4call finallyMethod and do something  --->>  false
    5

    4. 不拋 Exception,當 finally 代碼塊里面遇上 System.exit() 方法 將結束和終止整個程序,而不只是方法
     1
     2public static boolean finallyExitTest() {
     3        try {
     4            int i = 10 / 2;  // 不拋出 Exception
     5            System.out.println("i vaule is : " + i);
     6            return true;   // 獲得被執行的機會,但由于 finally 已經終止程序,返回值沒有機會被返回
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return true;
    10        }
    finally {
    11            finallyMethod();
    12            System.exit(0);// finally 中含有 System.exit() 語句,System.exit() 將退出整個程序,程序將被終止
    13        }

    14    }

    15

    后臺輸出結果:
    1
    2i vaule is : 5
    3
    4call finallyMethod and do something  --->>  
    5

    5. 拋出 Exception,當 catch 和 finally 同時遇上 return,catch 的 return 返回值將不會被返回,finally 的 return 語句將結束整個方法并返回
     1
     2public static boolean finallyTest1() {
     3        try {
     4            int i = 10 / 0// 拋出 Exception,后續處理被拒絕
     5            System.out.println("i vaule is : " + i);
     6            return true;   // Exception 已經拋出,沒有獲得被執行的機會
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return true;  // Exception 已經拋出,獲得被執行的機會,但返回操作將被 finally 截斷
    10        }
    finally {
    11            finallyMethod();
    12            return false;  // return 將結束整個方法,返回 false
    13        }

    14    }

    15

    后臺輸出結果:
    1
    2 -- Exception --
    3
    4call finallyMethod and do something  --->>  false
    5

    6. 不拋出 Exception,當 finally 遇上 return,try 的 return 返回值將不會被返回,finally 的 return 語句將結束整個方法并返回
     1
     2public static boolean finallyTest2() {
     3        try {
     4            int i = 10 / 2;  // 不拋出 Exception
     5            System.out.println("i vaule is : " + i);
     6            return true;   // 獲得被執行的機會,但返回將被 finally 截斷
     7        }
     catch (Exception e) {
     8            System.out.println(" -- Exception --");
     9            return true;
    10        }
    finally {
    11            finallyMethod();
    12            return false// return 將結束這個方法,不會在執行完之后再跳回 try 或 catch 繼續執行,返回 false
    13        }

    14    }

    15

    后臺輸出結果:
    1
    2i vaule is : 5
    3
    4call finallyMethod and do something  --->>  false
    5

    結語:
    (假設方法需要返回值)
    java 的異常處理中,
    在不拋出異常的情況下,程序執行完 try 里面的代碼塊之后,該方法并不會立即結束,而是繼續試圖去尋找該方法有沒有 finally 的代碼塊,
    如果沒有 finally 代碼塊,整個方法在執行完 try 代碼塊后返回相應的值來結束整個方法;
    如果有 finally 代碼塊,此時程序執行到 try 代碼塊里的 return 語句之時并不會立即執行 return,而是先去執行 finally 代碼塊里的代碼,
    若 finally 代碼塊里沒有 return 或沒有能夠終止程序的代碼,程序將在執行完 finally 代碼塊代碼之后再返回 try 代碼塊執行 return 語句來結束整個方法;
    若 finally 代碼塊里有 return 或含有能夠終止程序的代碼,方法將在執行完 finally 之后被結束,不再跳回 try 代碼塊執行 return。
    在拋出異常的情況下,原理也是和上面的一樣的,你把上面說到的 try 換成 catch 去理解就 OK 了 *_*





      
    posted on 2012-07-08 09:45 fancydeepin 閱讀(70174) 評論(9)  編輯  收藏

    評論:
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2013-12-06 09:57 | 弱水
    寫的非常好!清晰明了!  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2013-12-26 17:03 | pierr
    總結得好  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-04-03 12:02 | newbee
    頂,這篇把異常處理的很多種具體情況都列出來。學習了
    以后也要像博主一樣積累各種細節,不斷提高  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?[未登錄] 2015-09-02 13:03 | 大大
    如果catch里面沒有return,但程序被拋出了,該如何處理呢?  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-10-15 10:40 | 旺仔
    @大大
    如果有finally,就會在執行完catch之后去執行finally,如果沒有程序就結束了吧。

    我推理的,沒有寫代碼驗證,如果你驗證了,告訴我一下哈  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-11-16 14:31 | 321
    ew2e  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2016-04-06 15:05 | readme
    寫的很好,很容易理解,已學習!!  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?[未登錄] 2016-04-22 15:59 | 大大
    給樓主贊一個  回復  更多評論
      
    # re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2016-05-06 19:08 | mage
    挖墳了。。。搜異常再拋出時候搜到就進來看看。try catch就當做是一個另類的if else就好了。遇到異常就從try 切換到 catch里面,所以根本不會有兩個return都執行到的情況。。這個finnally中的是特殊情況了。

    return時候和函數傳參數是一樣的,return對象時候,是return的引用,return基本數據類型時候,是基本數據類型的值的復制。
    順序就是先try/catch的return,再finally的,finally中的return的值會覆蓋之前的值。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品无码久久久久去q| 96免费精品视频在线观看| 国产成人人综合亚洲欧美丁香花 | 亚洲AV无码成人精品区天堂| 伊人婷婷综合缴情亚洲五月| 浮力影院亚洲国产第一页| 亚洲一区精品无码| 亚洲精品~无码抽插| 亚洲av中文无码乱人伦在线r▽| 久久精品视频亚洲| 亚洲综合一区二区国产精品| 亚洲美女aⅴ久久久91| 亚洲Av高清一区二区三区| 亚洲综合一区无码精品| 亚洲精品无AMM毛片| 黄色a三级三级三级免费看| 一边摸一边爽一边叫床免费视频| 国产日韩在线视频免费播放| 免费国产成人α片| 国产成人精品免费视频网页大全| 久久久久久免费视频| 全免费一级午夜毛片| 亚洲国产91精品无码专区| 亚洲乱码国产一区三区| 久久亚洲春色中文字幕久久久| 久久久久se色偷偷亚洲精品av| 亚洲精品永久在线观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲一级毛片免费观看| 成年女人毛片免费视频| 免费一级毛片在级播放| 亚洲啪啪综合AV一区| 亚洲制服丝袜在线播放| 苍井空亚洲精品AA片在线播放 | 亚洲入口无毒网址你懂的| 色欲aⅴ亚洲情无码AV| 国产中文字幕在线免费观看| 亚洲免费福利视频| 亚洲成av人片一区二区三区| 亚洲va中文字幕无码久久| 亚洲熟妇久久精品|