2017-01-31 16 views
0

これは私が出力を理解するために、書いて、どのようにfinallyブロックが実行されるサンプルコードです:予期しない出力

public static void finallyBlockExecution(int num) 
{ 
    try 
    { 
     if (num != 14) 
     { 
      Console.WriteLine("num is {0}", num); 
      exceptionMethod(++num); 
     } 
    } 
    finally 
    { 
     Console.WriteLine("Finally executed.. {0}", num); 
    } 
} 

を私はこのようなメソッドを呼び出すと:ClassA.finallyBlockExecution(10); 出力は次のとおりです。

num is 10 
num is 11 
num is 12 
num is 13 
finally executed.. 14 
finally executed.. 14 
finally executed.. 13 
finally executed.. 12 
finally executed.. 11 

私はfinallyが5回実行されることを知っているが、私はそれが二回14を印刷している理由を把握することはできませんよ。

+1

この方法 – martijnn2008

+0

{静的な無効メイン(文字列[] args){ .exceptionMethod(10)を呼び出すコードを表示してください。 }}そのメソッドはクラスBで定義されています –

答えて

0

プログラムフローがtryブロックに到達し、finallyブロックが定義されている場合、finallyブロックは常に実行されます。 finallyブロックを実行せずにメソッドを返すことはできません。それが「最終的に実行された.. 14」が2度印刷された理由です。次のコードブロックがあるとします。

public int DoSomeCalculation() 
{ 
    int a=0; 
    try 
    { 
    //perform some calculations 
    return a; 
    } 
    catch(Exception ex) 
    { 
    return -1; 
    } 
    finally 
    { 
    Console.WriteLine("Do some cleanup"); 
    } 
    } 

tryブロックまたはcatchブロックからメソッドが返されるかどうかは、最終的にブロックが実行されます。