ホームページ  >  記事  >  Java  >  Finally ブロック内の変数を変更しても戻り値に影響しないのはなぜですか?

Finally ブロック内の変数を変更しても戻り値に影響しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-16 17:02:03790ブラウズ

Why Does Modifying a Variable in a Finally Block Not Affect the Returned Value?

Finally ブロックで変数を変更しても戻り値に影響しないのはなぜですか?

Java には try-finally ステートメントが用意されています。 try ブロックが正常に完了したか突然完了したかに関係なく、finally ブロック内の は常に実行されます。ただし、この動作は、try ブロックで return ステートメントが実行された後、finally ブロックで変数が変更されると、予期しない結果を引き起こす可能性があります。

この概念を説明するために、次の Java クラスを考えてみましょう。

public class Test {

    private String s;

    public String foo() {
        try {
            s = "dev";
            return s;  // Return the value of 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());
    }
}

この例では、foo メソッドは try ブロックで文字列「dev」を返します。ただし、finally ブロックは s 変数を「変数 s をオーバーライド」するように変更し、それが実行されたことを示すメッセージを出力します。

驚くべきことに、このコードの出力は次のようになります。

Entry in finally Block
dev

この結果は直観に反しているように見えるかもしれません。なぜなら、finally ブロックの実行後に s の値が「変数 s をオーバーライドする」と予想されるからです。ただし、これは当てはまりません。

  • try ブロックの return ステートメントはブロックの実行を完了し、その時点での s の値をすぐに返します。
  • Any finally ブロック内の s 変数に対する変更は、return ステートメントの実行後に行われます。したがって、finally ブロックによって変更されたとしても、s の戻り値は「dev」のままです。

この動作は、s 変数自体の値の変更にのみ適用されることに注意することが重要です。 s 変数が変更可能なオブジェクトへの参照である場合、finally ブロックで行われたそのオブジェクトの内容への変更は、戻り値に反映されます。

この詳細な説明では、finally ブロックで変数を変更する理由が明確になります。 finally ブロックが常に実行される場合でも、メソッドの戻り値は変更されません。

以上がFinally ブロック内の変数を変更しても戻り値に影響しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。