/ / Stringが最後に戻って試してみる[block] - java、try-catch-finally

最後に文字列が返され、tryブロック[duplicate] - java、try-catch-finally

私はこの質問に出くわしました、そしてそれが与えている出力の理由を理解することができません。

プログラムは:

public static String method(){

String s = new String();
try
{
s = "return value from try block";
return s;
}
catch (Exception e)
{
s = s + "return value from catch block";
return s;
}
finally
{
s = s + "return value from finally block";
}

}

出力は次のとおりです。

tryブロックからの戻り値

今、私はそれをデバッグし、の価値 s 〜で return s の声明 try ブロックは return value from try block, return value from catch block その後 returned from finally block.

それでも出力は:

tryブロックからの戻り値

誰かがこのふるまいを説明してもらえますか?

回答:

回答№1は1

まず、Javaがどのように処理するのかを理解しましょう。メソッド呼び出し スレッドごとに別々のスタックメモリがあります。メソッドを呼び出すと、Javaは内部的にスタックの先頭にレコードを挿入します。レコードにはパラメータやオブジェクトなどの詳細が含まれています。

ここに1つ興味深い分野があります:戻り値。 returnステートメントが見つかるたびに、フィールドは更新されます。今すぐコードを観察します。

の中に try ブロックでは、戻り値フィールドは、フィールドからの戻り値に設定されます。 try ブロック。実行シーケンスに従って finally ブロックが実行されます。今 finally ブロックは文字列参照を変更します s。変更しませんでした return value tryブロックによって以前に解決されたフィールド。最後に、メソッド呼び出しは完了し、Javaは内部的にレコードをポップし、戻り値フィールドを返します。そのため、tryブロックからの戻り値が返されます。

もし finally blockは変更後の文字列を返し、その後戻り値フィールドは再度更新され、更新された文字列が返されます。


回答№2の場合は-1

避ける return statementtry block 含める場合 finally あなたのコードでは代わりにメソッドの最後にそれを使用してください。また、finallyブロックで返された変数の値を変更することはできません。 見る https://stackoverflow.com/a/3643047/6286156


-2の回答№3

最後に

最後にtry / catchステートメントでコードを "always"実行するために使用されます。

lock.lock();
try {
//do stuff
} catch (SomeException se) {
//handle se
} finally {
lock.unlock(); //always executed, even if Exception or Error or se
}

Java 7では新たにtry with resources文を使って、明示的または暗黙的にjava.io.Closeableまたはjava.lang.AutoCloseableを実装しているリソースを自動的に閉じることができます。