ホームページ >Java >&#&チュートリアル >「finally」ブロック内の変数を変更しても Java の戻り値に影響しないのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 06:09:11513ブラウズ

Why Does Modifying a Variable in a `finally` Block Not Affect the Return Value in Java?

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

Java では、finally ブロックは戻り値に影響を与えるべきではないと一般に理解されています。その方法。ただし、特に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 in finally Block
dev

コントロールが出力されるのに、finally ブロックで s がオーバーライドされないのはなぜですかOutput?

説明

try ブロックは return ステートメントの実行で完了します。 return ステートメントの実行時の s の値は、メソッドによって返される値です。後で (return ステートメントが完了した後)finally 節が s の値を変更するという事実は、(その時点では) 戻り値を変更しません。

上記の例では、try ブロック内の return ステートメントはセットを設定します。戻り値は「dev」に返されます。その後、finally ブロックで s が「変数 s をオーバーライド」に設定されますが、この変更は戻り値がすでに設定された後に行われます。したがって、戻り値は依然として "dev" です。

この動作は、プリミティブ変数または不変オブジェクトの値の変更にのみ適用されることに注意することが重要です。 s が可変オブジェクトへの参照であり、そのオブジェクトの内容がfinally ブロックで変更された場合、それらの変更は戻り値に表示されます。

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

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