隨筆-126  評(píng)論-247  文章-5  trackbacks-0

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

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

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

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

          12


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

          11    }

          12

          后臺(tái)輸出結(jié)果:
          1
          2 -- Exception --
          3call catchMethod and return  --->>  false
          4

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

          13    }

          14

          后臺(tái)輸出結(jié)果:
          1
          2 -- Exception --
          3call catchMethod and return  --->>  
          4call finallyMethod and do something  --->>  false
          5

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

          14    }

          15

          后臺(tái)輸出結(jié)果:
          1
          2i vaule is : 5
          3
          4call finallyMethod and do something  --->>  false
          5

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

          14    }

          15

          后臺(tái)輸出結(jié)果:
          1
          2i vaule is : 5
          3
          4call finallyMethod and do something  --->>  
          5

          5. 拋出 Exception,當(dāng) catch 和 finally 同時(shí)遇上 return,catch 的 return 返回值將不會(huì)被返回,finally 的 return 語(yǔ)句將結(jié)束整個(gè)方法并返回
           1
           2public static boolean finallyTest1() {
           3        try {
           4            int i = 10 / 0// 拋出 Exception,后續(xù)處理被拒絕
           5            System.out.println("i vaule is : " + i);
           6            return true;   // Exception 已經(jīng)拋出,沒(méi)有獲得被執(zhí)行的機(jī)會(huì)
           7        }
           catch (Exception e) {
           8            System.out.println(" -- Exception --");
           9            return true;  // Exception 已經(jīng)拋出,獲得被執(zhí)行的機(jī)會(huì),但返回操作將被 finally 截?cái)?/span>
          10        }
          finally {
          11            finallyMethod();
          12            return false;  // return 將結(jié)束整個(gè)方法,返回 false
          13        }

          14    }

          15

          后臺(tái)輸出結(jié)果:
          1
          2 -- Exception --
          3
          4call finallyMethod and do something  --->>  false
          5

          6. 不拋出 Exception,當(dāng) finally 遇上 return,try 的 return 返回值將不會(huì)被返回,finally 的 return 語(yǔ)句將結(jié)束整個(gè)方法并返回
           1
           2public static boolean finallyTest2() {
           3        try {
           4            int i = 10 / 2;  // 不拋出 Exception
           5            System.out.println("i vaule is : " + i);
           6            return true;   // 獲得被執(zhí)行的機(jī)會(huì),但返回將被 finally 截?cái)?/span>
           7        }
           catch (Exception e) {
           8            System.out.println(" -- Exception --");
           9            return true;
          10        }
          finally {
          11            finallyMethod();
          12            return false// return 將結(jié)束這個(gè)方法,不會(huì)在執(zhí)行完之后再跳回 try 或 catch 繼續(xù)執(zhí)行,返回 false
          13        }

          14    }

          15

          后臺(tái)輸出結(jié)果:
          1
          2i vaule is : 5
          3
          4call finallyMethod and do something  --->>  false
          5

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





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

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

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

          return時(shí)候和函數(shù)傳參數(shù)是一樣的,return對(duì)象時(shí)候,是return的引用,return基本數(shù)據(jù)類型時(shí)候,是基本數(shù)據(jù)類型的值的復(fù)制。
          順序就是先try/catch的return,再finally的,finally中的return的值會(huì)覆蓋之前的值。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 绵竹市| 崇州市| 瑞丽市| 鄂州市| 新密市| 彭阳县| 方山县| 安多县| 雷山县| 东至县| 富源县| 桦川县| 陕西省| 承德市| 新乐市| 鹰潭市| 淄博市| 集贤县| 繁峙县| 左权县| 永仁县| 双牌县| 莆田市| 乌鲁木齐县| 定兴县| 巴塘县| 岐山县| 虹口区| 衡南县| 拜泉县| 达州市| 辽中县| 玉林市| 综艺| 临湘市| 昭平县| 临澧县| 浠水县| 洛南县| 旬邑县| 轮台县|