私はこの質問に出くわしました、そしてそれが与えている出力の理由を理解することができません。
プログラムは:
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 statement
に try 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を実装しているリソースを自動的に閉じることができます。