2016-03-16 39 views
0

我在鏈系統中使用異常處理的不同方法。Java方法拋出它的原型,但不會拋出任何異常從它的身體

請找我下面的代碼結構:

mainflowMethod { 

    try{ 
      outerMethod(); 
     } 
     catch(SystemException se){ 

      //handle exception here 
     } 

     catch(BusinessException be){ 

      //handle exception here 
     } 

    } 


    outerMethod throws SystemException, BusinessException { 

    try{ 
     innerMethod(); 

     if(some_condition_matched){ 

     throw new SystemException(errcode1111); 

     } 
    } 
    catch (OTHERException) { 
     //some other exception handling 
     // but neither SystemException nor BusinessException 
    } 

    } 


    innerMethod throws SystemException, BusinessException { 

    doProcess(); 

    } 


    doProcess throws SystemException, BusinessException { 

    throw new BusinessException(errcode2222); 

    } 

現在的疑問是:

  1. BusinessException(errcode2222)是否達到了mainFlowMethod(),或者它會丟失在任何地方?

  2. SystemException(errcode1111)是否會達到mainFlowMethod()或者它會在任何地方丟失?

請幫我擺脫這種懷疑。提前致謝 !!

+0

爲什麼不運行它並找出自己的?代碼就在你面前! – f1sh

+0

建議做不同的事情:嘗試將你的方法推入不同的類;因爲這會讓你**嘲笑其他類。突然之間,您可以編寫單元測試,保證您在其他地方發現異常。 – GhostCat

回答

0

以你爲例;

doProcess總是拋出BusinessException,因此永遠不會運行if(some_condition_matched){行。

捕獲mainFlowMethod上的Throwed BusinessException。

如果doProcess不拋出BusinessException和condition_matched,outermethod拋出SystemException並被mainFlowMethod捕獲。

你想看看Checkedunchecked exception

經過例外是受捕捉或指定的要求。 所有異常均爲檢查異常,但 錯誤,RuntimeException及其子類指示的異常除外。

因此,檢查異常從未丟失,你必須趕上它們,否則你的代碼永遠不會編譯。

但未經檢查的異常可能會導致應用程序崩潰。

1

你會在mainFlowMethod()中得到兩個異常,因爲你沒有在你的方法中捕獲它們:doProcess(),innerMethod()和outerMethod()。

+0

但是如果不從內部拋出它會傳播回調用方法嗎? – NawazSE

+0

沒有拋出它,如果你的異常擴展了Exception類(但不是運行時),你必須在它出現的方法中捕獲它。 –

0

如果其中任何一個例外實際上被拋出,那麼它們將會傳播到mainFlowMethod()並且會在那裏被捕獲。

如果這兩種情況都沒有發生,那麼問題就沒有實際意義了。

您的代碼並不顯示在那裏BusinessException被拋出,但它可能在innerMethod()被拋出,或者它可以在innerMethod()未來版本中被拋出......如果在一個單獨的類來實現。

一般情況下,異常不會丟失。它們不是被捕獲就是被傳播。