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

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

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

    duansky'weblog

    統(tǒng)計(jì)

    留言簿(3)

    友情鏈接

    閱讀排行榜

    評(píng)論排行榜

    淺析Java語言中兩種異常的差別

    Java提供了兩類主要的異常:runtime exception和checked exception。所有的checked exception是從java.lang.Exception類衍生出來的,而runtime exception則是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

      它們的不同之處表現(xiàn)在兩方面:機(jī)制上和邏輯上。


    一、機(jī)制上

      它們?cè)跈C(jī)制上的不同表現(xiàn)在兩點(diǎn):1.如何定義方法;2. 如何處理拋出的異常。請(qǐng)看下面CheckedException的定義:

    public?class?CheckedException?extends?Exception
    {

     
    public?CheckedException()?{}
     
    public?CheckedException(?String?message?)
     
    {
      
    super(?message?);
     }

    }


    以及一個(gè)使用exception的例子:

    public?class?ExceptionalClass
    {

     
    public?void?method1()
      
    throws?CheckedException
      
    {
       
    //??throw?new?CheckedException(?“出錯(cuò)了“?);
      }

     
    public?void?method2(?String?arg?)
      
    {
       
    if(?arg?==?null?)
       
    {
        
    throw?new?NullPointerException(?“method2的參數(shù)arg是null!”?);
       }

      }

     
    public?void?method3()?throws?CheckedException
      
    {
       method1();
      }

    }


    你可能已經(jīng)注意到了,兩個(gè)方法method1()和method2()都會(huì)拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會(huì)拋出exception,可是它卻聲明會(huì)拋出CheckedException。在向你解釋之前,讓我們先來看看這個(gè)類的main()方法:

    public?static?void?main(?String[]?args?)
    {

     ExceptionalClass?example?
    =?new?ExceptionalClass();
     
    try
     
    {
      example.method1();
      example.method3();
     }

     
    catch(?CheckedException?ex?)?{}?

    ????????????example.method2(?
    null?);
    }


    在main()方法中,如果要調(diào)用method1(),你必須把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出Checked exception。

      相比之下,當(dāng)你調(diào)用method2()時(shí),則不需要把它放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出的exception不是checked exception,而是runtime exception。會(huì)拋出runtime exception的方法在定義時(shí)不必聲明它會(huì)拋出exception。

      現(xiàn)在,讓我們?cè)賮砜纯磎ethod3()。它調(diào)用了method1()卻沒有把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中。它是通過聲明它會(huì)拋出method1()會(huì)拋出的exception來避免這樣做的。它沒有捕獲這個(gè)exception,而是把它傳遞下去。實(shí)際上main()方法也可以這樣做,通過聲明它會(huì)拋出Checked exception來避免使用try/catch程序塊(當(dāng)然我們反對(duì)這種做法)。

      小結(jié)一下:

      * Runtime exceptions:

      在定義方法時(shí)不需要聲明會(huì)拋出runtime exception;

      在調(diào)用這個(gè)方法時(shí)不需要捕獲這個(gè)runtime exception;

      runtime exception是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

      * Checked exceptions:

      定義方法時(shí)必須聲明所有可能會(huì)拋出的checked exception;

      在調(diào)用這個(gè)方法時(shí),必須捕獲它的checked exception,不然就得把它的exception傳遞下去;

      checked exception是從java.lang.Exception類衍生出來的。

    二、邏輯上

      從邏輯的角度來說,checked exceptions和runtime exception是有不同的使用目的的。checked exception用來指示一種調(diào)用方能夠直接處理的異常情況。而runtime exception則用來指示一種調(diào)用方本身無法處理或恢復(fù)的程序錯(cuò)誤。

      checked exception迫使你捕獲它并處理這種異常情況。以java.net.URL類的構(gòu)建器(constructor)為例,它的每一個(gè)構(gòu)建器都會(huì)拋出MalformedURLException。MalformedURLException就是一種checked exception。設(shè)想一下,你有一個(gè)簡單的程序,用來提示用戶輸入一個(gè)URL,然后通過這個(gè)URL去下載一個(gè)網(wǎng)頁。如果用戶輸入的URL有錯(cuò)誤,構(gòu)建器就會(huì)拋出一個(gè)exception。既然這個(gè)exception是checked exception,你的程序就可以捕獲它并正確處理:比如說提示用戶重新輸入。

      再看下面這個(gè)例子:

    public?void?method()
    {

     
    int?[]?numbers?=?{?1,?2,?3?};
     
    int?sum?=?numbers[0]?numbers[3];
    }


    在運(yùn)行方法method()時(shí)會(huì)遇到ArrayIndexOutOfBoundsException(因?yàn)閿?shù)組numbers的成員是從0到2)。對(duì)于這個(gè)異常,調(diào)用方無法處理/糾正。這個(gè)方法method()和上面的method2()一樣,都是runtime exception的情形。上面我已經(jīng)提到,runtime exception用來指示一種調(diào)用方本身無法處理/恢復(fù)的程序錯(cuò)誤。而程序錯(cuò)誤通常是無法在運(yùn)行過程中處理的,必須改正程序代碼。

      總而言之,在程序的運(yùn)行過程中一個(gè)checked exception被拋出的時(shí)候,只有能夠適當(dāng)處理這個(gè)異常的調(diào)用方才應(yīng)該用try/catch來捕獲它。而對(duì)于runtime exception,則不應(yīng)當(dāng)在程序中捕獲它。如果你要捕獲它的話,你就會(huì)冒這樣一個(gè)風(fēng)險(xiǎn):程序代碼的錯(cuò)誤(bug)被掩蓋在運(yùn)行當(dāng)中無法被察覺。因?yàn)樵诔绦驕y試過程中,系統(tǒng)打印出來的調(diào)用堆棧路徑(StackTrace)往往使你更快找到并修改代碼中的錯(cuò)誤。有些程序員建議捕獲runtime exception并紀(jì)錄在log中,我反對(duì)這樣做。這樣做的壞處是你必須通過瀏覽log來找出問題,而用來測試程序的測試系統(tǒng)(比如Unit Test)卻無法直接捕獲問題并報(bào)告出來。

      在程序中捕獲runtime exception還會(huì)帶來更多的問題:要捕獲哪些runtime exception?什么時(shí)候捕獲?runtime exception是不需要聲明的,你怎樣知道有沒有runtime exception要捕獲?你想看到在程序中每一次調(diào)用方法時(shí),都使用try/catch程序塊嗎?

    轉(zhuǎn)自:http://www.pconline.com.cn/pcjob/process/sun/experience/0511/719750_1.html

    posted on 2008-02-03 15:10 duansky 閱讀(199) 評(píng)論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 成人毛片100免费观看| 日日AV拍夜夜添久久免费| 国产福利在线免费| 国产精品亚洲不卡一区二区三区| 亚洲福利秒拍一区二区| AAAAA级少妇高潮大片免费看| 九月婷婷亚洲综合在线| 狠狠色伊人亚洲综合网站色 | 亚洲精品中文字幕无码A片老| 99免费视频观看| 亚洲日韩欧洲乱码AV夜夜摸| 国产99久久亚洲综合精品| 成人免费视频69| 久久亚洲精品无码aⅴ大香 | 久久久久女教师免费一区| 亚洲人成网站在线观看播放动漫| 7x7x7x免费在线观看| 亚洲综合久久久久久中文字幕| 国产美女无遮挡免费网站| 立即播放免费毛片一级| 久久久久亚洲AV成人片| 免费看片在线观看| 亚洲性色AV日韩在线观看| 成人永久福利免费观看| 日韩免费人妻AV无码专区蜜桃| 小说区亚洲自拍另类| 亚洲日韩精品无码一区二区三区 | 全免费a级毛片免费看无码| 亚洲依依成人亚洲社区| 亚洲国产成人久久精品影视| 99精品视频在线免费观看| 男女啪啪免费体验区| 久久精品国产精品亚洲人人| 免费无码H肉动漫在线观看麻豆| 国产精品亚洲片在线| 中国人xxxxx69免费视频| 亚洲精品无码久久久久久| 亚洲午夜久久影院| 亚洲人成精品久久久久| 四虎1515hm免费国产| 成人国产精品免费视频|