戻り値に対するFinallyブロックの影響
Javaでは、メソッドの戻り値に対するFinallyブロックの動作が直観に反する場合があります。 。コード スニペットを分析して、この現象の根本的な理由を詳しく調べてみましょう。
次のコードを考えてみましょう:
public class Test { private String s; public String foo() { try { s = "dev"; return s; } finally { s = "override variable s"; System.out.println("Entry in finally Block"); } } public static void main(String[] xyz) { Test obj = new Test(); System.out.println(obj.foo()); } }
実行すると、コードは「Entry infinally Block」と出力しますが、「」を返します。開発者。」これは、戻り値が try ブロック内の return ステートメントの実行によって決定されるためです。 finally ブロック内の 's' に対する変更は、try ブロックの完了後に発生するため、戻り値には反映されません。
これは 's' の値の変更に適用されることに注意することが重要です。オブジェクト自体の参照の変更ではありません。 「s」が変更可能なオブジェクトへの参照であり、その内容がfinally ブロックで変更された場合、それらの変更は戻り値に表示されます。
Java 言語仕様 (JLS) は、これに関する詳細なルールの概要を示しています。セクション 14.20.2 の動作。 try-finally ステートメントの場合、try ブロックとfinally ブロックの両方に return ステートメントがある場合、finally ブロックの戻り値が優先されます。これは、return ステートメントの実行がブロックの突然の終了とみなされるためです。
要約すると、メソッドの戻り値は try ブロック内の return ステートメントによって決まります。 finally ブロック内の変数に加えられた変更は、値であろうとオブジェクトの変更であろうと、finally ブロックに return ステートメントも含まれていない限り、戻り値には影響しません。
以上がFinally ブロックは Java のメソッドの戻り値にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。