2011-12-29 69 views
1

我想重試例外條款像這樣調用函數:遞歸調用的例外條款的功能

private int mTries = 0; 
private void myFunction() { 
    try { 
     // do something 
    } catch (Exception e) { 
     if (mTries ++ < MAX_TRIES; 
      myFunction(); 
     } 
    } 
} 

我的問題,無論堆棧內存的使用情況,catch子句中調用一個函數遞歸就像在正常情況下調用它一樣?我想知道如果我的應用程序在android平臺上運行,這樣做是否會炸掉堆棧。

private void anotherFunction(int i) { 
     if (i == 0) 
      return; 
     anotherFunction(i--); 
} 
+2

anotherFunction(int i)看起來很好,就像你不從i <0開始一樣。關於第一個用法,通常不鼓勵在java中使用異常處理程序來處理應用程序邏輯,並且它很糟糕性能。 – keni 2011-12-29 23:23:52

+0

同意keni。對我來說,這有一個不好的代碼味道。 – 2011-12-29 23:30:44

回答

5

爲什麼不把它寫成這樣?

private void myFunction(){ 
    int triesRemaining = MAX_TRIES; 
    while(triesRemaining-- > 0){ 
     try{ 
     // ... do stuff 
     return; 
     } 
     catch(Exception e){ 
     } 
    } 
    throw new Exception("too many failures"); 
} 

然而,我嚴重建議您縮小catch子句,這樣你只能望塵莫及只有那些類型的異常之後,你要繼續處理。

0

你的第二個實現將總是導致堆棧溢出。 (嘗試傳遞一個值,即使是1,它也會失敗)。

0

我的問題,無論堆棧內存使用情況,在catch子句中遞歸地調用一個函數,就像在正常情況下調用它一樣?

是的,它是完全一樣的。