返される変数に対する Final ブロックの影響: 例外を理解する
Java では、finally ブロックは try-catch ブロックに関係なくコードの実行を保証します。結果や突然の終了。ただし、これらのブロックが返された変数とどのように相互作用するかを理解することが重要です。
次のクラスを考えてみましょう:
public class Test { private String s; public String foo() { try { s = "dev"; return s; } finally { s = "override variable s"; // This change doesn't affect the returned value System.out.println("Entry in finally Block"); } } public static void main(String[] xyz) { Test obj = new Test(); System.out.println(obj.foo()); // Prints "dev" } }
予期しない動作のデコード
foo() メソッドが呼び出されると、finally ブロックが実行される前に戻り値が決定されます。 try ブロックは、戻り値となる「dev」を s に代入する return ステートメントで完了します。その後のfinallyブロック内のsへの変更は、戻り値には反映されません。
ルールを理解する
Java言語仕様によると、tryブロックは次のように完了します。 return ステートメントによって突然終了します。 Finally ブロックは突然終了した後に実行され、正常に完了すると try ステートメントも突然終了します。したがって、finally ブロックの return ステートメントは、try ブロック内で決定された戻り値をオーバーライドします。
可変オブジェクトと不変オブジェクト
この動作は、参照するオブジェクトではなく、 s の実際の値。 s が可変オブジェクト (配列やカスタム クラスなど) への参照であり、その内容がfinally ブロックで変更された場合、それらの変更は戻り値に影響します。ただし、String オブジェクトは不変であるため、その値を変更することはできません。
結論
要約すると、finally ブロックは try ブロックで返された変数を変更できません。返される値は、finally ブロックが実行される前に決定され、その後、finally ブロック内で変数の値を変更しても、返される結果には影響しません。
以上がJava では、Finally ブロックは返された変数をオーバーライドしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。