posts - 2,  comments - 0,  trackbacks - 0
          http://zangxt.javaeye.com/blog/421508

          try/catch/finally語(yǔ)句下,finally子句是肯定會(huì)執(zhí)行的。但是很多人做不同的測(cè)試,卻得出了不同的結(jié)論。

          具體的原理最好是去看《深入java虛擬機(jī)》,里面對(duì)jsr、ret等幾個(gè)指令做了詳細(xì)的說(shuō)明。這里不深入分析,而僅僅是從表現(xiàn)形式上看一下finally的特征。

          代碼:

            

          /*
          * author: Zang XT
          */

          public class TestFinal {
          public static void main(String[] args) {
          System.out.println("test1:" + testFinal1());
          System.out.println("test2:" + testFinal2());
          System.out.println("test3:" + testFinal3());
          System.out.println("test4:" + testFinal4());
          }

          static int testFinal1() {
          int i = 1;
          try {
          return i;
          } finally {
          System.out.println("in testFinal1():finally 肯定會(huì)被執(zhí)行的!");
          i = 48;
          }
          }

          static String testFinal2() {
          String str = "try";
          try {
          return str;
          } finally {
          System.out.println("in testFinal2():finally 肯定會(huì)被執(zhí)行的!");
          str = "finally";
          }
          }

          static StringBuilder testFinal3() {
          StringBuilder build = new StringBuilder("try ");
          try {
          return build;
          } finally {
          System.out.println("in testFinal3():finally 肯定會(huì)被執(zhí)行的!");
          build.append("finally");
          build = new StringBuilder("你猜我是誰(shuí)!");
          }
          }

          static String testFinal4() {
          try {
          return "return in try";
          } finally {
          System.out.println("in testFinal4():finally 肯定會(huì)被執(zhí)行的!");
          return "return in finally";
          }
          }
          }

           

           

          輸出是:

          in testFinal1():finally 肯定會(huì)被執(zhí)行的!

          test1:1

          in testFinal2():finally 肯定會(huì)被執(zhí)行的!

          test2:try

          in testFinal3():finally 肯定會(huì)被執(zhí)行的!

          test3:try finally

          in testFinal4():finally 肯定會(huì)被執(zhí)行的!

          test4:return in finally

               結(jié)論很明顯,finally的語(yǔ)句確實(shí)執(zhí)行了,而且肯定是在方法return之前執(zhí)行的,而且,如果finally中有return語(yǔ)句的話,方法直接結(jié) 束。這里需要注意的只有一點(diǎn):在try中的return語(yǔ)句會(huì)將返回結(jié)果值壓棧,然后轉(zhuǎn)入到finally子過(guò)程,等到finally子過(guò)程執(zhí)行完畢之后 (沒(méi)有return),再返回。
          下面具體看4個(gè)例子:
                在testFinal1()中,return i;會(huì)將結(jié)果i的值,也就是1壓入棧。即使在finally中將i修改了(i=48),也不回對(duì)已經(jīng)壓入棧里的1造成任何影響。
                在testFinal2()中,return str;將str的內(nèi)容壓入棧,比如我們假設(shè)str的內(nèi)容為0x108(只是一個(gè)地址值),通過(guò)這個(gè)地址值我們能找到"try",那棧里的內(nèi)容就是 0x108。執(zhí)行str = "finally",這時(shí)候str這個(gè)變量的內(nèi)容可能變?yōu)?x237了,這是串"finally"的地址。方法調(diào)用結(jié)束后,返回的是什么?return時(shí) 壓入棧里的0x108。所以在打印結(jié)果時(shí),我們打印的是通過(guò)0x108找到的字符串"try"。
                在testFinal3()中,return 壓棧的是build這個(gè)變量的值,比如是0x3579,通過(guò)這個(gè)值我們可以找到StringBuilder對(duì)象。finally語(yǔ)句塊中對(duì)這個(gè)對(duì)象的內(nèi)容 進(jìn)行了修改。build = new StringBuilder("你猜我是誰(shuí)!");讓build變量指向了一個(gè)新的對(duì)象,這時(shí)候build的值可能是0x4579了。但是,別忘了,原來(lái) 的StringBuilder對(duì)象仍然在0x3579處,而我們壓棧的正是0x3579啊!方法返回后,我們得到的返回值0x3579,通過(guò)這個(gè)引用值找 到相應(yīng)的StringBuilder對(duì)象,所以打印的結(jié)果是test3:try finally。
                在testFinal4()中,finally有return語(yǔ)句,直接返回,方法結(jié)束。
                為什么不同的人有不同的結(jié)論?關(guān)鍵是沒(méi)有正確理解壓棧的是什么東西。其實(shí)初學(xué)java的時(shí)候,如果理解了變量是什么,并區(qū)分引用和對(duì)象本身就不會(huì)得到錯(cuò)誤的結(jié)論了。再有,如果理解java中,方法調(diào)用都是采用傳值模式的話,這里也就類似的可以明白了。
          posted on 2009-09-28 11:09 iConnect 閱讀(131) 評(píng)論(0)  編輯  收藏 所屬分類: Java

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


          網(wǎng)站導(dǎo)航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(2)

          文章分類(17)

          文章檔案(16)

          收藏夾(17)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 壤塘县| 三亚市| 石林| 江达县| 龙川县| 万源市| 曲水县| 兖州市| 手游| 眉山市| 黑水县| 襄垣县| 阆中市| 香河县| 扶绥县| 淮安市| 南部县| 三都| 新巴尔虎右旗| 武强县| 昌图县| 开原市| 灵寿县| 双辽市| 张家口市| 鹿泉市| 华亭县| 鸡泽县| 靖边县| 资中县| 新蔡县| 兴安盟| 沛县| 古交市| 两当县| 建瓯市| 白沙| 长泰县| 五华县| 乌审旗| 河池市|