2011-12-29 7 views
1

内の関数を呼び出す:再帰的に私はこのような例外句で関数を呼び出す再試行したい例外条項

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

私の質問に関係なく、スタックメモリ使用量を、catch節で再帰関数を呼び出します通常の場合と同じですか?私のアプリがアンドロイドプラットフォーム上で実行されている場合、これを行うことがスタックを吹き飛ばすかどうか私は疑問に思っています。

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

anotherFunction(int i)は、i <0で始まらないので、大丈夫です。最初の使用法については、アプリケーションロジックのjavaで例外ハンドラーを使用することは一般的にお勧めできません。パフォーマンス。 – keni

+0

ケニーと同意します。私には、これには悪いコードの匂いがあります。 –

答えて

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

2番目の実装では常にスタックオーバーフローが発生します。 (1の値を渡してみると失敗します)。

0

私の質問は、スタックメモリの使用状況にかかわらず、catch節で関数を再帰的に呼び出すことは通常の場合と同じですか?

はい、まったく同じです。

関連する問題