国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java異常處理中同時有finally和return語句的執行問題

2019-11-26 14:51:26
字體:
來源:轉載
供稿:網友

在Java中當try、finally語句中包含return語句時,執行情況到底是怎樣的,finally中的代碼是否執行,大家眾說紛紜,有的說會執行,有的說不會執行,到底哪種說法正確,現在通過下面的例子加以說明:
     第一種情況:try中包含return語句,finally中不包含

public class TestTry {   static String s="";   public static void main(String args[]){     s = test1();     System.out.println("8 "+s);   }   public static String test1(){          try{       System.out.println("try.....");       return s = "a";     }     finally{       s="b";        System.out.println("17 "+s);     }   } } 

  這里我們定義了一個字符串 s,在try里面將"a"賦值給s,并直接返回,在finally里面把"b"賦值給s,最終s的值是a還是b呢?下面是執行的結果

try..... 17 b 8 a 

 我們發現最后的結果是a,但是b優先于a打印出來了,這是為什么呢?通過debug單步調試我們發現,在執行try中的return之前會先執行finally中的代碼,之后再執行return語句。如果finally中也包含return語句,會出現什么情況呢,我們看第二種情況。
     第二種情況:try,finally中都包含return語句
      我們將上面的代碼稍作改動

public class TestTry {   static String s="";   public static void main(String args[]){     s = test1();     System.out.println("8 "+s);   }   public static String test1(){          try{       System.out.println("try.....");       return s = "a";     }     finally{       return s="b";              }   } } 

 將finally中的s="b";直接改成return s="b";,會出現什么樣的結果呢?字符串s是a還是b呢?

try..... 8 b 

 我們發現最后的打印結果是b。
 

我們知道return語句用在某一個方法中,一是用于返回函數的執行結果,二是用于返回值為void類型的函數中,僅僅是一個return語句(return ;),此時用于結束方法的執行,也即此return后的語句將不會被執行,當然,這種情況下return語句后不能再有其它的語句了。

 

  public static int print() {    int c = 1;    try {      c++;      System.out.println("try執行中...");      return c+100; //--------1    } catch (Exception e) {      e.printStackTrace();      //return c;  //--------4    } finally {      c++;      System.out.println("finally執行中...");      return c; //--------2    }    //return c;  //---------3  }

  程序執行的結果為:

run:
try執行中...
finally執行中...
3
成功構建 (總時間: 0 秒)

  注意,2與3位置處的return語句只能有一個,并且2、3、4中必須有一個return語句,如果2出執行后方法就結束了,3處的語句得不到執行。

   try語句塊執行到1處時,會將會將函數的返回值存放到另外一個臨時變量(不同與c的變量,它的值為102)中,由于未發生異常,緊接著將會執行finally語句塊,2處又遇到一個語句塊,并將返回值存放到臨時變量(值為3)中,最終返回的是此處的臨時變量的值,此處return執行完成后,該方法結束。  

 public static int print() {    int c = 1;    try {      c++;      System.out.println(c);      System.out.println("try");      return c+100; //--------1    }finally {      c++;      System.out.println(c);      System.out.println("finally");          }  }

  上述代碼中finally語句塊中沒有return語句,函數最終返回的是第一個臨時變量的值,也即102,執行結果如下:

run:tryfinally102成功構建 (總時間: 0 秒)

結論:1.無論try里面有沒有return語句,finally語句一定都會執行(不愧是finally,名字起的好)。
        2.如果finally中沒有return語句,try里面有return,那么在執行try中的return語句之前會先去執行finally中的代碼,再去執行try中的return語句;如果在finally中也包含return語句,將會直接返回,不再去執行try中的return語句。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新野县| 文安县| 榆林市| 宁陵县| 禹州市| 衡阳县| 湘乡市| 库尔勒市| 西盟| 福州市| 昌吉市| 稷山县| 兰溪市| 大名县| 简阳市| 红原县| 岳阳县| 上犹县| 镇赉县| 鹤庆县| 平阴县| 和田市| 浮梁县| 嘉荫县| 金阳县| 深州市| 杭锦后旗| 康马县| 遵化市| 信丰县| 连云港市| 余干县| 泰宁县| 太康县| 大渡口区| 怀集县| 蒙阴县| 尼勒克县| 图片| 如皋市| 芦溪县|