3

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 セクション ジャンプ セクションを使用して最終セクションに移動しますか、それともスタックは既に維持されていますか?

4

5 に答える 5

1

これは、return ステートメントが機能する方法と、それが try with finally ステートメントと相互作用する方法によるものです。

JLSのセクション 14.17 では、return ステートメントについて説明しています。

Expression を含む return ステートメントは、それを含むメソッドの呼び出し元に制御を移そうとします。Expression の値がメソッド呼び出しの値になります。より正確には、このような return ステートメントを実行すると、最初に Expression が評価されます。Expression の評価が何らかの理由で突然終了した場合、return ステートメントはその理由で突然終了します。Expression の評価が正常に完了して値 V が生成された場合、return ステートメントは突然完了します。その理由は、値 V で返されるためです。

最後の文は、return ステートメントの式が正常に評価された場合、return ステートメントが突然完了することを示しています。あなたの例では、ステートメントと理由が値10であるため、tryブロックは突然終了します(値10に評価されます)。returnreturni

あなたの例でreturnは、finally ブロックで試行されているため、JLS のセクション §14.20.2で次に何が起こるかがわかります。

  • try ブロックの実行が R 以外の理由で突然終了した場合、finally ブロックが実行され、次の選択肢があります。
    • finally ブロックが正常に完了すると、try ステートメントは R の理由で突然完了します。
    • finally ブロックが理由 S で突然終了した場合、try ステートメントは理由 S で突然終了します (理由 R は破棄されます)。

したがって、tryreturn ステートメントが値 10 に評価されたためにブロックが突然終了し、finally ブロックが正常に完了したため、メソッドは 10 を返します。

于 2013-10-23T10:53:29.940 に答える