Java 言語仕様、セクション §14.20.2によると
finally ブロックを含む try ステートメントは、最初に try ブロックを実行することによって実行されます。次に、選択肢があります。
- try ブロックの実行が正常に完了すると、finally ブロックが実行され、次の選択肢があります。
- finally ブロックが正常に完了すると、try ステートメントは正常に完了します。
- finally ブロックが理由 S で突然終了した場合、try ステートメントは理由 S で突然終了します。
それを正しく解釈すると、try ブロックの実行後に最終的に呼び出されますが、これがどのように機能し、なぜ出力を得たのか、
public static int TestTryFinallyBlock()
{
int i =0;
try
{
i= 10; //Perform some more operation
return i;
}
finally
{
i = 40;
}
}
public static void main( String[] args )
{
int i1 = TestTryFinallyBlock(); //Here the output was 10 not 40
}
これがどのようにして出力 10 を生成したかを知りたいです。
try ブロックが実行され、return ステートメントが検出されたときに、出力値が既にスタックにプッシュされてから、finally ブロックが実行されます。
return が最初に検出され、次に finally ブロックが実行されることはわかっていますが、出力は 10 ですが、
jvm はどのように解釈するか、try finally ブロックは jvm によってどのように処理または変換されるのでしょうか?
jvm は GOTO セクション ジャンプ セクションを使用して最終セクションに移動しますか、それともスタックは既に維持されていますか?