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

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

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

    重新認(rèn)識(shí)Java finally

    關(guān)于java finally 網(wǎng)上有2篇文章個(gè)人認(rèn)為相當(dāng)不錯(cuò)
    以下是轉(zhuǎn)貼內(nèi)容:

    1 . JAVA finally字句的異常丟失和返回值覆蓋解析
    原帖地址 :
    http://blog.csdn.net/sureyonder/article/details/5560538
    轉(zhuǎn)貼
    Java虛擬機(jī)在每個(gè)try語(yǔ)句塊和與其相關(guān)的catch子句的結(jié)尾 處都會(huì)“調(diào)用”finally子句的子例程。實(shí)際上,finally子句在方法內(nèi)部的表現(xiàn)很象“微型子例程”。finally子句正常結(jié)束后-指的是finally子句中最后一條語(yǔ)句正常執(zhí)行完畢,不包括拋出異常,或執(zhí)行return、continue、break等情況,隸屬于這個(gè)finally子句的微型子例程執(zhí)行“返回”操作。程序在第一次調(diào)用微型子例程的地方繼續(xù)執(zhí)行后面的語(yǔ)句。

    finally“微型子例程”不等同于方法函數(shù)的調(diào)用,finally子句都是在同一個(gè)棧內(nèi)執(zhí)行的,微型子例程的“返回”操作也不會(huì)涉及到方法退棧,僅僅是使程序計(jì)數(shù)器pc跳轉(zhuǎn)到同一個(gè)方法的一個(gè)不同的位置繼續(xù)執(zhí)行。
    一 異常丟失
        public static void exceptionLost()  
         {  
           try  
           {  
             try  
             {  
               throw new Exception( "exception in try" );  
             }  
             finally  
             {  
               throw new Exception( "exception in finally" );  
             }  
           }  
           catch( Exception e )  
           {  
             System.out.println( e );  
           }  
         }  

    exceptionLost()的輸出結(jié)果是“exception in finally”,而不是try塊中拋出的異常,這是JAVA異常機(jī)制的一個(gè)瑕疵-異常丟失。

    在字節(jié)碼中,throw語(yǔ)句不是原子性操作。在較老的JDK中,exceptionLost()中try塊的throw語(yǔ)句分解為幾步操作:
    1) 把Exception("exception in try")對(duì)象引用存儲(chǔ)到一個(gè)局部變量中
      astore_2  // pop the reference to the thrown exception, store into local variable 2
    2) 調(diào)用finally微型子程序
    3) 把局部變量中的Exception("exception in try")對(duì)象引用push到操作數(shù)棧頂,然后拋出異常
      aload_2  // push the reference to the thrown exception from local variable 2

      athrow   // throw the exception

    如果finally通過(guò)break、return、continue,或者拋出異常而退出,那么上面的第3步就不會(huì)執(zhí)行。

    在JDK1.6中,通過(guò)字節(jié)碼我們可以看到,finally子句作為一種特殊的catch來(lái)實(shí)現(xiàn)的,下面是exceptionLost()方法的異常表:

    Exception table:
      from   to   target  type
       0     10    10     any
     0     21    21     Class java/lang/Exception

    finally可以捕獲從0行到9行之間拋出的任何類型(any)的異常,并重新拋出捕獲的異常,或者拋出一個(gè)自己構(gòu)造的新異常,這個(gè)新異常就會(huì)覆蓋try語(yǔ)句塊中的異常。
    二 返回值覆蓋

        public static int getValue()  
         {  
           int value = 0;  
             
           try  
           {  
             value = 100;  
               
             return value;  
           }  
           finally  
           {  
             value = 200;  
           }  
         }  

    這個(gè)方法的返回值是100還是200?結(jié)果是100。
    在字節(jié)碼中,return語(yǔ)句不是原子性操作,它會(huì)把getValue()中的return語(yǔ)句分解為幾步操作:
    1) 把value值存儲(chǔ)到一個(gè)局部變量(這里命名為temp)中:
       iload_0   // push local variable 0 - the 100
       istore_2   //  pop an int (the 100), store into local varaible 2
    2) 調(diào)用finally微型子程序
    3) 把局部變量(指temp)的值push到操作數(shù)棧頂,然后返回到調(diào)用方法
         iload_2  // push local varaible 2 - the 100
       ireturn      // return int on top of the stack - the 100: return 100

    由于return語(yǔ)句在返回之前會(huì)把返回值保存到一個(gè)臨時(shí)的局部變量中,所以在finally子句內(nèi)對(duì)value重新賦值不會(huì)影響返回值。

    了解finally子句內(nèi)在的一些知識(shí),我們能夠了解finally能夠做什么和不能夠做什么,這樣會(huì)幫助我們正確使用finally子句。

    2 . 關(guān)于 Java 中 finally 語(yǔ)句塊的深度辨析
    原帖地址 :
    http://www.ibm.com/developerworks/cn/java/j-lo-finally/index.html?ca=drs-
    轉(zhuǎn)貼
    關(guān)于 Java 虛擬機(jī)是如何編譯 finally 語(yǔ)句塊的問(wèn)題,有興趣的讀者可以參考《 The JavaTM Virtual Machine Specification, Second Edition 》中 7.13 節(jié) Compiling finally。那里詳細(xì)介紹了 Java 虛擬機(jī)是如何編譯 finally 語(yǔ)句塊。實(shí)際上,Java 虛擬機(jī)會(huì)把 finally 語(yǔ)句塊作為 subroutine(對(duì)于這個(gè) subroutine 不知該如何翻譯為好,干脆就不翻譯了,免得產(chǎn)生歧義和誤解。)直接插入到 try 語(yǔ)句塊或者 catch 語(yǔ)句塊的控制轉(zhuǎn)移語(yǔ)句之前。但是,還有另外一個(gè)不可忽視的因素,那就是在執(zhí)行 subroutine(也就是 finally 語(yǔ)句塊)之前,try 或者 catch 語(yǔ)句塊會(huì)保留其返回值到本地變量表(Local Variable Table)中。待 subroutine 執(zhí)行完畢之后,再恢復(fù)保留的返回值到操作數(shù)棧中,然后通過(guò) return 或者 throw 語(yǔ)句將其返回給該方法的調(diào)用者(invoker)。請(qǐng)注意,前文中我們?cè)?jīng)提到過(guò) return、throw 和 break、continue 的區(qū)別,對(duì)于這條規(guī)則(保留返回值),只適用于 return 和 throw 語(yǔ)句,不適用于 break 和 continue 語(yǔ)句,因?yàn)樗鼈兏揪蜎](méi)有返回值。

    posted on 2011-11-01 16:56 AK47 閱讀(832) 評(píng)論(0)  編輯  收藏 所屬分類: java相關(guān)

    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲美女在线观看播放| 免费a级毛片无码a∨免费软件| 亚洲成色www久久网站夜月| 免费理论片51人人看电影| 久草福利资源网站免费| 免费看黄网站在线看| 亚洲熟妇无码八V在线播放| 亚洲AV无码成人精品区在线观看 | 亚洲视频一区在线观看| 亚洲最大av无码网址| 香蕉高清免费永久在线视频| 四虎在线成人免费网站| 无码精品人妻一区二区三区免费看| 一级做a免费视频观看网站| 青草久久精品亚洲综合专区| 亚洲AV无码成人专区| 精品亚洲成AV人在线观看| 亚洲国产另类久久久精品小说| 亚洲国产黄在线观看| 国产又黄又爽又猛的免费视频播放| 国产精品免费观看久久| 91精品成人免费国产片| 最近中文字幕电影大全免费版 | 国产日韩成人亚洲丁香婷婷| 精品免费国产一区二区三区| 毛片a级毛片免费观看免下载| 国色精品卡一卡2卡3卡4卡免费| 久久A级毛片免费观看| 免费A级毛片无码专区| 91精品手机国产免费| 99视频在线看观免费| 99在线热视频只有精品免费| 一区二区免费视频| 免费观看在线禁片| 日韩在线永久免费播放| 免费A级毛片无码视频| **aaaaa毛片免费| 国产福利在线免费| 性盈盈影院免费视频观看在线一区| 国产成人免费爽爽爽视频| 毛片网站免费在线观看|