ホームページ  >  記事  >  Java  >  Java では、Finally ブロックは返された変数をオーバーライドしますか?

Java では、Finally ブロックは返された変数をオーバーライドしますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 09:15:02332ブラウズ

Does the Finally Block Override a Returned Variable in Java?

返される変数に対する 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 サイトの他の関連記事を参照してください。

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