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

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

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

    ALL is Well!

    敏捷是一條很長的路,摸索著前進著

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 23 文章 :: 71 評論 :: 0 Trackbacks

    關于try-catch-finally的用法我就不多說了。網上搜一下,資料很多。

    這里我想主要討論下在finally塊加入return語句屏蔽異常的問題。

    我們先來看這樣一段代碼,


    代碼1

     1public class FinallyTest {   
     2    public static void main(String[] args) {   
     3        new FinallyTest().print();   
     4    }
       
     5    public void print() {   
     6        int i = -1;   
     7        try {   
     8            Thread.sleep(1);   
     9            i = 1 / 0;   
    10        }
     catch (Exception e) {   
    11            System.out.println("at catch block step 1.");   
    12            throw e;   
    13        }
     finally {   
    14            System.out.println("at finally block i = " + i);   
    15        }
       
    16    }
       
    17}


    以上代碼在Eclipse里是不會編譯通過的,因為在catch塊中throw了一個異常,而print方法并沒有聲明要拋出異常。


    現在我們修改代碼,讓它能夠通過編譯,代碼2

    1public class FinallyTest {   
    2    public static void main(String[] args) throws Exception {   
    3        new FinallyTest().print();   
    4    }
       
    5    public void print() throws Exception {   
    6…  
    7


    就是在printmain方法后加throws Exception,然后運行,看運行結果:

    1at catch block step 1.   
    2at finally block i = -1  
    3Exception in thread "main" java.lang.ArithmeticException: / by zero   
    4    at wxhx.csdn2.FinallyTest.print(FinallyTest.java:12)   
    5    at wxhx.csdn2.FinallyTest.main(FinallyTest.java:5)  

    程序先是走到了catch塊的第一句,打印了at catch block step 1.

    但并沒有緊接著去throw e即沒有立刻拋出這個異常,之所以這樣說,是因為異常的信息是在finally塊的打印信息之后才打印的。

    這個例子告訴我們,finally不管出異常與否,都必行的代(如果中途終止了jvm,就不必去執行了)

    那么何時執行finally塊中的代碼呢?

    在這個例子中,try塊中有異常拋出,所以finally塊中的代碼是在執行了catch語句之后、退出方法之前被執行的(如果這里執行了throw e,則方法就退出了)


     

    下面再看另外一個代碼,代碼3

     1public class FinallyTest {   
     2    public static void main(String[] args) {   
     3        new FinallyTest().print();   
     4    }
       
     5    public void print() {   
     6        int i = -1;   
     7        try {   
     8            Thread.sleep(1);   
     9            i = 1 / 0;   
    10        }
     catch (Exception e) {   
    11            System.out.println("at catch block step 1.");   
    12            throw e;   
    13        }
     finally {   
    14            System.out.println("at finally block i = " + i);   
    15            return;   
    16        }
       
    17    }
       
    18}
     


     

    這段代碼與之前相比,在finally塊中增加了return語句。

    雖然在catch塊中有throw e語句,但在print方法后并不用聲明throws Exception,也可以通過編譯。

    因為在try塊中有Thread.sleep(1);語句,所以必須要捕獲InterruptedException,但在這種情況下,即使我們把catch塊去掉了,也不會有問題,這是怎么回事呢?

    因為在finally塊中的return語句屏蔽了異常。

    經過代碼2我們已經知道了,異常在finally塊被執行之前,雖然會執行catch塊中的代碼,但并不會退出方法,在退出方法之前,會轉向finally塊中執行,而在finally塊中又恰好有return語句,所以方法就正常退出了,在try塊中產生的異常就不會有機會被拋出。


    ----2009年02月13日

    posted on 2010-09-01 12:00 李 明 閱讀(720) 評論(0)  編輯  收藏 所屬分類: J2SE技術知識
    主站蜘蛛池模板: 野花香在线视频免费观看大全 | 成人免费无码大片A毛片抽搐 | 亚洲制服丝袜第一页| 免费女人高潮流视频在线观看| 久久亚洲精品视频| 99视频在线免费观看| 亚洲成a人片在线观看中文动漫| 日韩免费的视频在线观看香蕉| 亚洲Av综合色区无码专区桃色| 久久久久国色av免费看| 亚洲精品视频观看| 无人在线观看免费高清视频| 亚洲精品天堂成人片AV在线播放 | 亚洲婷婷在线视频| 久久精品无码一区二区三区免费| 亚洲av午夜电影在线观看| 深夜国产福利99亚洲视频| 国产久爱免费精品视频| 亚洲综合在线观看视频| 欧亚精品一区三区免费| 免费无码专区毛片高潮喷水| 亚洲色无码一区二区三区| 8x8×在线永久免费视频| 亚洲一久久久久久久久| 日批日出水久久亚洲精品tv| 在线观看免费无码专区| 亚洲国产日韩视频观看| 亚洲精品无码av天堂| 99精品视频免费在线观看| 亚洲AV一区二区三区四区| 亚洲精品国精品久久99热一| 永久免费视频网站在线观看| 久久亚洲AV成人无码国产电影| 国产亚洲精品精品国产亚洲综合| 16女性下面无遮挡免费| 国产亚洲福利精品一区二区| 亚洲av片劲爆在线观看| 在线永久免费观看黄网站| 黄色网站软件app在线观看免费| 亚洲国产成人精品激情| 区三区激情福利综合中文字幕在线一区亚洲视频1 |