Try-catch-finally-returnの明確化 [重複]について
質問
上記のトピック(タイトル参照)に関連する、このフォーラムで既に行われたすべての質問を読むことで、私は以下を十分に理解しました。
finally
は常に呼び出されることを理解しました。(ただし
System.exit
と無限ループを除く)。 しかし、私が知りたいのは、もし
return
がキャッチブロックの中で呼び出され、その後別の
return
がfinallyブロックから呼び出されます。
例えば
public static void main(String[]args) {
int a = new TestClass().absorbeTheValue();
}
int absorbeTheValue() {
try {
int a = 10/0;
if (a > 0) return 4;
} catch(Exception e) {
return 45;
} finally {
return 34;
}
}
つまり、ここでは(メソッドが呼ばれたときの)出力は、どんな場合でも34になるのです。つまり、finallyは常に実行されるということです。しかし、他の "return" は全く実行されないと思います。catch節のreturnですでに書き込まれている内容の上にfinallyが書き込まれるというのは、多くの投稿で見かけました。私の理解では、catch節の戻り値が評価されようとするとすぐに、制御フローは別の戻り値を持つfinally節に渡され、今度はcatch節に制御を戻さずに戻り値が評価されます。このようにして、唯一の
return
実行時に呼ばれるのはfinally returnだけです。あなたはこれに同意しますか?
A
return
で
finally
は、プログラムに制御を渡さず、値を返してメソッドを終了させます。そう言っていいのでしょうか?
どのように解決するのですか?
もし
return
の中に
try
ブロックに到達すると、制御を
finally
ブロックに制御を移し、関数は最終的に正常に戻ります(throwではありません)。
例外が発生しても、その後にコードが
return
から
catch
ブロックから、制御は
finally
ブロックに移行し、最終的に関数は正常に戻ります(throwではありません)。
あなたの例では
return
の中に
finally
であるため、何が起ころうとも、この関数は
34
というのは
finally
には最終的な(とでもいうべき)単語があるからです。
あなたの例では取り上げられませんでしたが、これはたとえ
catch
で例外が発生した場合
try
ブロックと
ではなく
をキャッチする。を行うことで
return
から
finally
を追加すると、例外を完全に抑制することができます。考えてみてください。
public class FinallyReturn {
public static final void main(String[] args) {
System.out.println(foo(args));
}
private static int foo(String[] args) {
try {
int n = Integer.parseInt(args[0]);
return n;
}
finally {
return 42;
}
}
}
これを引数を与えずに実行すると
$ java FinallyReturn
...このコードは
foo
は
ArrayIndexOutOfBoundsException
. しかし
finally
ブロックは
return
を実行すると、その例外は抑制されます。
このような理由から、この記事では
return
で
finally
.
関連
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Java:未解決コンパイル問題の解決方法
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] JavaScriptで複数の値を返す?
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
-
[解決済み】再試行キャッチはどのように実装するのですか?
-
[解決済み】try {...} finally {...} は良くて、try {...} catch{} はダメなのはなぜ?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
アノテーション「@Retention」の役割
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
maven レポート エラー 解決不可能な親POM
-
コンストラクタDate()が未定義である問題
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】returnはループを停止させるか?