[解決済み] finally ブロックで戻り値の変数を変更しても、戻り値が変更されないのはなぜですか?
質問
以下のような簡単なJavaクラスがあります。
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
なぜ
s
はオーバーライドされません。
finally
ブロックの中で、印刷出力を制御していますか?
どのように解決するのですか?
その
try
の実行でブロックは完了します。
return
ステートメントと
s
を実行した時点で
return
ステートメントが実行されると、そのメソッドから返される値になります。という事実は
finally
の値を後で変更します。
s
(の後)。
return
文が完了しても、(その時点では)戻り値は変わりません。
の値の変更に対処していることに注意してください。
s
の中にある
finally
ブロックではなく、そのオブジェクトに
s
を参照しています。もし
s
はミュータブルオブジェクトへの参照であった(これは
String
はそうではない)、そして
内容
のオブジェクトが変更されました。
finally
というブロックがあれば、その変更は戻り値に反映される。
このような動作の詳細なルールは、以下のページにあります。
Java言語仕様書14.20.2項
. を実行することに注意してください。
return
文の突然の終了としてカウントされます。
try
ブロック(".で始まる部分。
その他の理由でtryブロックの実行が突然終了した場合 R....
"が適用されます)。参照
JLS 14.17項
を使用する理由については
return
文は、ブロックの突然の終了を意味します。
さらに詳しく説明すると、もし
try
ブロックと
finally
ブロック
の
try-finally
ステートメントが突然終了するのは
return
ステートメントを使用する場合、§14.20.2の以下のルールが適用されます。
を実行した場合
try
ブロックが例外を発生させる以外の何らかの理由で突然終了した場合、その後にfinally
ブロックが実行され、その後、選択肢がある。
- もし
finally
ブロックが正常に終了するとtry
文は理由Rで突然終了する。- もし
finally
ブロックが理由Sで突然終了した場合はtry
文は理由 S で突然終了する (そして理由 R は破棄される)。
その結果
return
の文は
finally
ブロック全体の戻り値を決定します。
try-finally
ステートメントから返される値であり
try
ブロックは破棄されます。同様のことが
try-catch-finally
文は、もし
try
ブロックが例外を投げると、それをキャッチするのは
catch
ブロックの両方が
catch
ブロックと
finally
ブロックには
return
ステートメントを使用します。
関連
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
javaの模造品QQ WeChatのチャットルーム
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
[解決済み] Math.round(0.4999999999994) はなぜ1を返すのですか?
-
[解決済み] なぜPythonでは "finally "節が必要なのでしょうか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IllegalArgumentException この例外を解決する方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
javaでクラスを作成すると、enclosing classでないように見える
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした