qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          關于Java中的try-catch-finally語句和return

            第一:return語句并不是函數的最終出口,如果有finally語句,這在return之后還會執行finally(return的值會暫存在棧里面,等待finally執行后再返回)

            第二:finally里面不建議放return語句,根據需要,return語句可以放在try和catch里面和函數的最后。可行的做法有四:

            1、return語句只在函數最后出現一次。

            2、return語句僅在try和catch里面都出現。

            3、return語句僅在try和函數的最后都出現。

            4、return語句僅在catch和函數的最后都出現。

            注意,除此之外的其他做法都是不可行的,編譯器會報錯。

            (1)如果程序運行到try成功時可以返回結果,則采用方法2。(見下面的例子test0_1,在那個例子中,方法2和4都是可行的,但是推薦方法2?)

            (2)如果程序運行到catch時(即中途出錯時)無需再繼續執行后面的代碼了,則采取方法4;(見下面例子中的test0,在那個特殊的例子中,只能采取方法4)

            (3)如果程序運行到try或catch時還需要繼續執行后面的代碼,則采取方法1(見下面的例子test0_2,該例子只能采用方法1)。

            下面是測試代碼:

          public class Test {

              public static void main(String[] args) {
                  System.out.println("=============test1==================");
                  System.out.println(test1());
                  System.out.println("===============================");

                  System.out.println("=============test1_1==================");
                  System.out.println(test1_1());
                  System.out.println("===============================");

                  System.out.println("\n============test2===================");
                  System.out.println(test2());
                  System.out.println("===============================");

                  System.out.println("\n============test2_1===================");
                  System.out.println(test2_1());
                  System.out.println("===============================");

                  System.out.println("\n============test3===================");
                  System.out.println(test3());
                  System.out.println("===============================");

                  System.out.println("\n============test3_1===================");
                  System.out.println(test3_1());
                  System.out.println("===============================");
              }

              public static String test0() {
               String a;
               int b;
               try{
                b = 8/0;
               }catch(Exception e){
                return null;
               }
               a = String.valueOf(b);
               return a+b;
              }
           
              public static String test0_1() {
               String a;
               int b;
               try{
                b = 8/0;
                a = String.valueOf(b);
                   return a+b;
               }catch(Exception e){
                return null;
               }
               //return a+b;
              }
             
              public static String test0_2() {
               String a;
               int b=0;
               try{
                b = 8/0;
               }catch(Exception e){
               }
               a = String.valueOf(b);
               return a;
              }
             
              public static String test1() {
                  String a = "in try";
                  int n = -1;
                  try{
                      return a+n; //先執行這個,再執行finally
                  } catch ( Exception e ) {

                  } finally {
                   //對String和int的更改均無效
                      a = "in finally";
                      n = 123;
                      System.out.println("do finally");
                  }
                  return a; //不會執行
              }  //總結出一點:return語句并不是函數的最終出口,如果有finally語句,這在return之后還會執行finally

              public static String test1_1() {
                  String a = "in try";

                  try{
                      return a;
                  } catch ( Exception e ) {

                  } finally { //從eclpise報警告可看出,finally里面不建議有return語句
                      a = "in finally";
                      System.out.println("do finally");
                      return a; //注釋掉這句,eclipse將不再警告
                  }
              }

              public static int test2() {
                  int a = 1;

                  try{
                      return a;
                  } catch ( Exception e ) {

                  } finally {
                      a = 2;
                      System.out.println("do finally");
                  }

                  return a;
              } //很顯然,finally里面更改無效,返回的是a=1

              public static int test2_1() {
                  int a = 1;

                  try{
                      return a;
                  } catch ( Exception e ) {

                  } finally {
                      a = 2;
                      System.out.println("do finally");
                      return a;
                  }
              } //很顯然,a取finally里面的值,a=2

              //Helper類,將整數轉換成字符串
              static class Helper {
                  int a;

                  public String toString() {
                      return String.valueOf(a);
                  }
              }
             
              public static Helper test3() {
                  Helper h = new Helper();
                  h.a = 1;

                  try{
                      return h;
                  } catch ( Exception e ) {

                  } finally {
                      h.a = 2; //對h.a的更改起作用!!
                        //因為在try里面返回的是一個句柄,它指向的對象的內容 是可以改變的
                      System.out.println("do finally");
                  }
                 
                  return h; //這個不會被執行
              }

              public static Helper test3_1() {
                  Helper h = new Helper();
                  h.a = 1;

                  try{
                      return h;
                  } catch ( Exception e ) {

                  } finally {
                      h.a = 2; //返回a=2,這個不用說了
                      System.out.println("do finally");
                      return h;
                  }
              }


              /**
               * 總結:
               * return語句,finally里面不建議放return語句,根據需要,可以放在try和catch里面
               *
               */
             
          }

          posted on 2012-08-21 10:28 順其自然EVO 閱讀(227) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 通河县| 澎湖县| 绩溪县| 松滋市| 溧阳市| 万全县| 梁山县| 岳阳市| 玛纳斯县| 长春市| 琼结县| 都安| 土默特左旗| 金川县| 仪陇县| 楚雄市| 酒泉市| 九龙坡区| 余庆县| 长垣县| 北宁市| 高阳县| 延安市| 新泰市| 顺平县| 紫金县| 泰宁县| 韩城市| 塔河县| 达日县| 杨浦区| 大埔县| 礼泉县| 双鸭山市| 泸定县| 彰化县| 巴彦县| 龙泉市| 凤冈县| 毕节市| 那曲县|