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

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

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

          MethodB()

          MethodA()

          Main()

          MethodB()

          MethodA()

          Main()

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

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

          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). 在方法的聲明處通過(guò) throws 語(yǔ)句聲明拋出異常 , :

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

          ???? //do

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

          ?? }

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

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

          ? Public void methodA(int a){

          ??? Try{

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

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

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

          ?????? }}

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

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


          評(píng)論

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

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

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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 定南县| 南和县| 宁波市| 颍上县| 南木林县| 密云县| 绩溪县| 威海市| 沅陵县| 新泰市| 阿拉善右旗| 神农架林区| 洛浦县| 全南县| 大城县| 平南县| 武川县| 和平县| 青浦区| 宁乡县| 堆龙德庆县| 禄丰县| 任丘市| 南江县| 河曲县| 兰考县| 南岸区| 志丹县| 青河县| 平谷区| 库尔勒市| 衡水市| 西盟| 抚宁县| 永寿县| 巴青县| 泌阳县| 修水县| 阜平县| 西青区| 治县。|