1. ホーム
  2. java

[解決済み] finally'ブロックは本当に必要ですか?

2023-06-25 16:55:36

疑問点

Javaにはtry...catch...finallyブロックの3種類の組み合わせがあります。

  1. try...catch
  2. try...catch...finally
  3. try...最後に

finallyブロックが実行されると、制御はfinallyブロックの次の行に移ります。finallyブロックを削除し、そのステートメントをすべてtry...catchブロックの後の行に移動した場合、finallyブロックにステートメントがあるのと同じ効果があるでしょうか?

どのように解決するのですか?

ここで重要なポイントは、willcodeが最もよく表現していると思いますし、おそらく誰もがそのつもりでいますが、明確ではありません。

問題は、あなたが尋ねていることに何か非常に間違っていることです:"もし私がすべての文をfinallyブロックに書く代わりにcatchブロックの後に書いたら、何か問題があるでしょうか。

catchブロックの後にすべてのステートメントを書いた場合、あなたが言いたいことは以下の通りです。

1)例外は必ずキャッチする。

2) 例外をキャッチした後は必ず次の文に進みます。

これは、例外の後、常に"通常"実行を継続することを意味し、一般的にあなたが行うことです。 決して をしたいとは思っていません。

例外はあくまで例外であるべきです。 実際に例外を処理できるのであれば、まずその条件を考慮し、例外をまったく発生させないようにコードを書くのが常にベターです。 このモデルに従えば、例外は本当に例外的なもの、つまり、予想できなかったか、せいぜい修正できない程度の状態です。 本当に予期しないことこそ、あなたが目指すべきものなのです。 これは一般に、真の例外を処理できないことを意味し、それはまた、単に実行を継続すべきではなく、しばしば代わりにアプリケーションを終了させることを意味します。

通常行われるのは、エラーがコールスタックを遡って伝搬するのを許可することです。 これは、チェーンの上位の誰かがそれを処理できる可能性があるために行われると言う人もいます。 このようなことは基本的に起こりません。このようなことをする本当の目的は2つあります。 1つは、もしユーザーが修正できることがあれば、それを行うことです。そのため、ユーザーに報告できるようになるまで、エラーを伝播させるのです。 あるいは、ユーザーには修正できないが、デバッグのためにコールスタック全体を取得したい場合。 その場合、一番上でキャッチして優雅に失敗させるのです。

これでfinallyブロックがより意味を持つようになりました。 誰もが言うように、それは常に実行されます。 finallyの最も明確な使い方は、try...finallyブロックの中です。 今あなたが言っていることは、コードがうまく実行されれば、素晴らしいことです。まだ後始末をする必要があり、finallyが常に実行され、次に進みます。 しかし、例外が発生した場合は、finallyブロックが本当に必要になります。なぜなら、まだ後始末をする必要があるかもしれませんが、ここではもう例外をキャッチしていないので、もう先に進むことはできません。 しかし、ここではもう例外をキャッチしていないので、もう先に進むことはありません。finallyブロックは、クリーンアップを確実に行うために不可欠です。

例外が発生すると常に実行が停止するという考え方は、ある程度の経験を積まないと理解できないかもしれませんが、実際には常にそうすることが望ましいのです。 エラーが起こった場合、それがとても些細なことで、最初からそれを説明するべきだったか、さもなければ、この先ますます多くのエラーが起こるのを待つだけなのです。

エラーを飲み込んでしまうこと、つまり、エラーをキャッチして次に進むことは、プログラムが予測不可能になり、バグを発見して修正することができなくなるため、最もやってはいけないことです。

よく書かれたコードは、結果がどうであれ、リソースが常に解放されていることを確認するために必要な数だけtry ... finallyブロックを含んでいます。 しかし、よく書かれたコードは、一般的に少数の try ... catch ブロックしか含んでいません。 しかし、通常、エラーをキャッチしてそのまま続行することはないでしょう。