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

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

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

    Jvm 學(xué)習(xí)——異常處理

    異常表

    每一個(gè)try語(yǔ)句塊catch的異常都與異常表中的一項(xiàng)相對(duì)應(yīng),異常表中的每一項(xiàng)都包括:

    1. 起點(diǎn)
    2. 終點(diǎn),始終把catch異常位置的pc指針偏移量的最大值大1
    3.  處理異常時(shí)跳轉(zhuǎn)到的字節(jié)碼序列中的pc指針偏移量
    4.  catch的異常類(lèi)的常量池索引

     

    例如:

    public class Test {
        
    public static void main(String[] args) {

            
    try {
                Class.forName(
    "java.lang.String");
            }
     catch (ClassNotFoundException e) {
                e.printStackTrace();
            }


        }

    }

    javap –c查看字節(jié)碼如下:

     

    Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       
    0:    aload_0
       
    1:    invokespecial    #1//Method java/lang/Object."<init>":()V
       4:    return

    public static void main(java.lang.String[]);
      Code:
       
    0:    ldc    #2//String java.lang.String
       2:    invokestatic    #3//Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
       5:    pop    
       
    6:    goto    14
       
    9:    astore_1
       
    10:    aload_1
       
    11:    invokevirtual    #5//Method java/lang/ClassNotFoundException.printStackTrace:()V
       14:    return
      Exception table:
       from   to  target type
         
    0     6     9   Class java/lang/ClassNotFoundException
    }

     

    可見(jiàn)ClassNotFoundException異常可能會(huì)在0~6之間拋出,9開(kāi)始處的代碼處理此異常。

     

    當(dāng)產(chǎn)生異常的時(shí)候,jvm將會(huì)在整個(gè)異常表中搜索與之匹配的項(xiàng),如果當(dāng)前pc在異常表入口所指的范圍內(nèi),并且所拋出的異常是此入口所指向的類(lèi)或者其子類(lèi),則跳轉(zhuǎn)到對(duì)應(yīng)的處理代碼繼續(xù)執(zhí)行。

     

    方法可能會(huì)拋出哪些已檢查異常

    Class文件的attribute_info中保存有Exceptions屬性,記錄著每個(gè)方法throws的異常信息。具體的可以查看class類(lèi)文件格式相關(guān)的文章。

     

    athrow指令從棧頂彈出Throwable對(duì)象引用,拋出異常。

     

    finally語(yǔ)句

    jvm規(guī)范中,finally語(yǔ)句是通過(guò)jsr/jsr_wret指令實(shí)現(xiàn)的。當(dāng)執(zhí)行jsr/jsr_w的時(shí)候?qū)?/span>finally執(zhí)行完成后的返回地址壓入棧中,進(jìn)入finally后會(huì)馬上將此地址保存到一個(gè)局部變量中,執(zhí)行完成后,ret從此局部變量中取出返回地址。???為什么會(huì)先把返回地址保存到局部變量中呢???因?yàn)椋?dāng)從finally語(yǔ)句返回的時(shí)候需要將返回地址成棧中彈出,當(dāng)finally語(yǔ)句非正常結(jié)束(break,continue,return, 拋異常)的時(shí)候就不用再考慮這個(gè)問(wèn)題。

     

    以下是jvm規(guī)范中Compiling finally的一段:

    void tryFinally() {
        
    try {
            tryItOut();
        }
     finally {
            wrapItUp();
        }

    }

    the compiled code is
    Method 
    void tryFinally()
       
    0     aload_0            // Beginning of try block
       1    invokevirtual #6         // Method Example.tryItOut()V
       4     jsr 14            // Call finally block
       7     return            // End of try block
       8     astore_1            // Beginning of handler for any throw
       9     jsr 14            // Call finally block
      12     aload_1            // Push thrown value
      13     athrow            // and rethrow the value to the invoker
      14     astore_2            // Beginning of finally block
      15     aload_0            // Push this
      16     invokevirtual #5         // Method Example.wrapItUp()V
      19     ret 2            // Return from finally block
    Exception table:
           From     To     Target         Type
        
    0        4        8           any

     

    當(dāng)tryItOut排除任何異常后都將會(huì)被異常表中的any項(xiàng)捕獲,執(zhí)行完finally后,會(huì)執(zhí)行athrow指令將異常拋出。

     

    jdk的某一個(gè)版本開(kāi)始就不會(huì)編譯出編譯出含jsr/jsr_wret的字節(jié)碼了,因?yàn)橛兄噶钌系娜毕荩瑢?dǎo)致jvm的檢驗(yàn)和分析系統(tǒng)出現(xiàn)漏洞。

     

    再說(shuō)finally的非正常退出

    finally中使用breakcontinuereturn、拋出異常等認(rèn)為是finally的非正常結(jié)束。非正常結(jié)束的時(shí)候,ret指令不會(huì)被執(zhí)行,很可能會(huì)出現(xiàn)意想不到的結(jié)果。如:

     

    public class Test {
        
    public static boolean test(boolean b) {
            
    while (b) {
                
    try {
                    
    return true;
                }
     finally {
                    
    /*
                    break;                          始終返回false
                    continue;                         javac編譯再java執(zhí)行會(huì)出現(xiàn)死循環(huán)
                                                    在eclipse中甚至?xí)霈F(xiàn)報(bào)錯(cuò):提示找到不main class
                    return false;                     始終返回false
                    throw new RuntimeException("");    拋出異常
                     
    */

                }

            }


            
    return false;
        }


        
    public static void main(String[] args) {
            System.out.println(test(
    true));
        }

    }


    建議:在寫(xiě)finally語(yǔ)句的時(shí)候,盡量避免非正常結(jié)束!


     

    posted on 2011-05-27 14:39 happyenjoylife 閱讀(2596) 評(píng)論(4)  編輯  收藏

    評(píng)論

    # re: Jvm 學(xué)習(xí)——異常處理 2011-05-27 16:46 代孕

    來(lái)學(xué)習(xí)了,謝謝博主的文章了。  回復(fù)  更多評(píng)論   

    # re: Jvm 學(xué)習(xí)——異常處理 2011-05-27 22:02 愛(ài)課件

    不錯(cuò)哦  回復(fù)  更多評(píng)論   

    # re: Jvm 學(xué)習(xí)——異常處理 2011-06-03 11:35 程先生

    字節(jié)碼,看不懂啊,去哪里學(xué)習(xí)啊?  回復(fù)  更多評(píng)論   

    # re: Jvm 學(xué)習(xí)——異常處理 2011-06-11 18:04 happyenjoylife

    @程先生
    字節(jié)碼可以看jvm規(guī)范,也可以看《深入java虛擬機(jī)》,又可以上網(wǎng)找找
      回復(fù)  更多評(píng)論   


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    <2011年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲国产精品乱码一区二区| 一级毛片a免费播放王色| 国产亚洲色婷婷久久99精品91| 2020因为爱你带字幕免费观看全集 | 毛片免费全部播放无码| 一级做a免费视频观看网站| 亚洲综合校园春色| 亚洲AV乱码久久精品蜜桃| 亚洲片一区二区三区| 国产精品免费综合一区视频| 99在线精品视频观看免费| 日韩精品在线免费观看| jizz在线免费观看| 国产精品亚洲а∨无码播放不卡| 亚洲人成人77777在线播放| 亚洲A∨无码一区二区三区| 久久亚洲AV无码西西人体| 国产伦一区二区三区免费| 成年女人免费碰碰视频| 免费人成网站在线观看10分钟| 久久久久久AV无码免费网站| 免费网站观看WWW在线观看| 2022免费国产精品福利在线| 国产亚洲精品仙踪林在线播放| 亚洲色大情网站www| 国产成人亚洲综合网站不卡| 亚洲国产综合在线| 亚洲欧洲春色校园另类小说| 老司机亚洲精品影院| 亚洲午夜精品一区二区| 亚洲妇熟XXXX妇色黄| 亚洲阿v天堂在线| 亚洲AV无码不卡无码| 亚洲AV美女一区二区三区| 亚洲精品高清久久| 亚洲v高清理论电影| 亚洲午夜久久影院| 亚洲国产精品成人综合久久久 | 最近2019中文字幕免费直播| 日本免费大黄在线观看| 4虎1515hh永久免费|