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

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

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

    posts - 7, comments - 10, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Java開發(fā)中的異常處理

    Posted on 2007-01-26 23:44 西門磚瓦 閱讀(1403) 評論(2)  編輯  收藏

    我覺得 Java 的異常處理要精簡 , 因?yàn)?/span> , 處理異常需要 JVM 付出額外的開銷 .Java 異常的根類為 java.lang.Throwable, 其有兩個(gè)直接的子類 :java.lang.Error java.lang.Exception. Error 表示程序本身無法恢復(fù)的嚴(yán)重錯(cuò)誤 ;Exception 類表示可以被程序捕獲并處理的 Bug. 我們也可以自定義類來拋出異常 , 但是都必須直接或間接繼承 Exception .

    (一) 錯(cuò)誤處理與 JVM 用方法調(diào)用堆棧

    MethodB()

    MethodA()

    Main()

    MethodB()

    MethodA()

    Main()

    我們知道 ,JVM 用方法調(diào)用棧 (Stack) 來跟蹤每個(gè)線程中一系列的方法調(diào)用過程 . 該棧保存了每個(gè)調(diào)用方法的本地信息 . : 一個(gè)棧中已經(jīng)有三個(gè)方法 ,MethodB 為當(dāng)前正在執(zhí)行的方法

    如果這個(gè)時(shí)候 , 方法中的代碼可能拋出異常 , 將會有兩種處理

    MethodB()

    MethodA()

    Main()

    MethodB()

    MethodA()

    Main()


    方法 :

    ? 1).

    ? Public void methodB(int a) {

    ??? Try{

    ?????? ? //do

    ????? If(a<0) throw new SpecialException();

    ??? }catch(SpecialException e){

    MethodB()

    MethodA()

    Main()

    ????? //do with Exception

    ?? }

    ? }

    ? 2). 在方法的聲明處通過 throws 語句聲明拋出異常 , :

    ?? Public void mothodB(int a) throws SpecialException{

    ???? //do

    ???? If(a<0) throw new SpecialException();

    ?? }

    當(dāng) java 的方法正常執(zhí)行完畢 ,JVM 會從 Stack 中彈出該方法的棧結(jié)構(gòu) , 然后繼續(xù)處理前一個(gè)方法 . 如果 java 方法在執(zhí)行代碼過程中拋出異常 ,JVM 必須找到能捕獲該異常的 Catch 代碼塊 . 他首先查看當(dāng)前方法是否存在這樣的 Catch 代碼塊 , 如果存在 , 就執(zhí)行 catch 代碼 , 否則 ,JVM 會從調(diào)用棧中彈出該方法的棧結(jié)構(gòu) , 繼續(xù)到前一個(gè)方法中查找合適的 catch 代碼塊 .

    ? 例如 : 當(dāng) MethodB() 方法拋出 SpecialException 時(shí) , 如果在該方法中提供了捕獲 SpecialException Catch 代碼塊 , 就執(zhí)行這個(gè)異常處理代碼塊 , 否則 , 如果采用第二種方式聲明繼續(xù)拋出 SpecialException,JVM 的處理流程將退回到上層調(diào)用方法 MethodA(), 再查看 A 有沒有捕獲 SpecialException. 如果 ,A 方法中存在捕獲 SpecialException catch 代碼塊 , 就執(zhí)行 . 此時(shí) A 方法定義如下 :

    ? Public void methodA(int a){

    ??? Try{

    ??????? methodB(a);

    ?????? }catch(SpecialException e){

    ??? ?????//do with Exception

    ?????? }}

    如果 ,A 方法也沒有捕獲 SpecialException, 而只是聲明拋出 SpecialException,JVM 處理流程將繼續(xù)退回到 main() 方法 . 如果 ,main() 里面仍然沒有找到處理該異常的代碼 , 該線程就會異常終止 . 如果 , 該線程是主線程 , 應(yīng)用程序也會終止 . 用戶終端就會看到原始異常信息 .

    ? 一般說來,在 java 程序中使用 try/catch 不會對應(yīng)用程序有很大的影響,僅僅當(dāng)異常發(fā)生時(shí), JVM 虛擬執(zhí)行額外的操作,來定位處理異常的代碼塊,這時(shí),對系統(tǒng)性能產(chǎn)生負(fù)面影響。但是,如果拋出異常的代碼和捕獲異常的代碼在一個(gè)方法中,這種影響就會小些,因此,不應(yīng)該用異常處理機(jī)制來控制程序的正常流程,而應(yīng)該僅僅用在程序可能出現(xiàn)異常的地方才使用 try/catch


    評論

    # re: Java開發(fā)中的異常處理  回復(fù)  更多評論   

    2007-01-27 18:01 by Dustin Tang[匿名]
    一句話:對異常一知半解.

    Exception是Java對流程控制的一個(gè)"市場細(xì)化"的補(bǔ)充,置于說異常對性能的影響云云,甚至由這個(gè)得出結(jié)論就是搞笑.

    # re: Java開發(fā)中的異常處理  回復(fù)  更多評論   

    2007-01-28 19:22 by 西門磚瓦
    呵呵,謝謝樓上的磚頭!
    但是,我至少看到很多人,在判斷執(zhí)行的時(shí)候,通常用try/catch來判斷是否滿足條件,
    如:
    try{
    //Do_1
    }
    catch{
    //Do_2
    }

    至少這樣,很影響系統(tǒng)的性能的!而且,太多的try/catch,給分析程序拋出異常也帶來不少困難!

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产一区二区三区亚洲综合| 亚洲娇小性xxxx色| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 亚洲精品天堂在线观看| 国产精品亚洲产品一区二区三区| 久久久久亚洲AV无码去区首| 午夜影视在线免费观看| 亚洲色欲色欲www在线播放| 性色av免费观看| 亚洲另类无码专区丝袜| 国产自产拍精品视频免费看| 亚洲国产精品久久久久秋霞小| 毛片免费全部免费观看| 久久亚洲色WWW成人欧美| 亚洲 小说区 图片区 都市| 亚洲一区二区三区免费| 久久精品国产亚洲AV麻豆王友容| 久久国产色AV免费看| 亚洲a∨无码男人的天堂| 国产午夜影视大全免费观看| 特级毛片在线大全免费播放| 日本亚洲欧洲免费天堂午夜看片女人员| 中文字幕av免费专区| 亚洲白嫩在线观看| 日韩特黄特色大片免费视频| jizz免费观看| 在线观看亚洲一区二区| 无码一区二区三区免费视频 | 亚洲成AV人片在线播放无码| 亚洲成人免费在线观看| 亚洲愉拍一区二区三区| 亚洲美女高清一区二区三区 | 亚洲麻豆精品国偷自产在线91| 国产成人无码区免费内射一片色欲| 久久久亚洲AV波多野结衣| 无码国产精品一区二区免费虚拟VR| 国产精品亚洲一区二区在线观看| 亚洲无av在线中文字幕| 我想看一级毛片免费的| a级男女仿爱免费视频| 亚洲欧美日韩国产精品一区|