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

          Java開發中的異常處理

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

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

          (一) 錯誤處理與 JVM 用方法調用堆棧

          MethodB()

          MethodA()

          Main()

          MethodB()

          MethodA()

          Main()

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

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

          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();

          ?? }

          java 的方法正常執行完畢 ,JVM 會從 Stack 中彈出該方法的棧結構 , 然后繼續處理前一個方法 . 如果 java 方法在執行代碼過程中拋出異常 ,JVM 必須找到能捕獲該異常的 Catch 代碼塊 . 他首先查看當前方法是否存在這樣的 Catch 代碼塊 , 如果存在 , 就執行 catch 代碼 , 否則 ,JVM 會從調用棧中彈出該方法的棧結構 , 繼續到前一個方法中查找合適的 catch 代碼塊 .

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

          ? Public void methodA(int a){

          ??? Try{

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

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

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

          ?????? }}

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

          ? 一般說來,在 java 程序中使用 try/catch 不會對應用程序有很大的影響,僅僅當異常發生時, JVM 虛擬執行額外的操作,來定位處理異常的代碼塊,這時,對系統性能產生負面影響。但是,如果拋出異常的代碼和捕獲異常的代碼在一個方法中,這種影響就會小些,因此,不應該用異常處理機制來控制程序的正常流程,而應該僅僅用在程序可能出現異常的地方才使用 try/catch


          評論

          # re: Java開發中的異常處理  回復  更多評論   

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

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

          # re: Java開發中的異常處理  回復  更多評論   

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 灵台县| 衡水市| 甘德县| 金华市| 绥棱县| 山阴县| 柞水县| 滨州市| 呈贡县| 方正县| 宜昌市| 金塔县| 沧源| 无锡市| 新巴尔虎左旗| 上犹县| 松溪县| 青浦区| 宜兴市| 深水埗区| 汾阳市| 手游| 怀仁县| 黄陵县| 象州县| 凤凰县| 宣城市| 苗栗市| 潼南县| 都昌县| 韩城市| 庆云县| 宣化县| 古丈县| 秦安县| 右玉县| 青浦区| 湖口县| 宁阳县| 临桂县| 林芝县|