[解決済み] finally'ブロックは本当に必要ですか?
疑問点
Javaにはtry...catch...finallyブロックの3種類の組み合わせがあります。
- try...catch
- try...catch...finally
- 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 ブロックしか含んでいません。 しかし、通常、エラーをキャッチしてそのまま続行することはないでしょう。
関連
-
[解決済み] Javaにデストラクタはありますか?
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】try {...} finally {...} は良くて、try {...} catch{} はダメなのはなぜ?
最新
-
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クラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
FindBugの使用概要
-
maven レポート エラー 解決不可能な親POM
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java基礎 - マッピングとQ/A
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] なぜfinallyブロックを使用するのか?重複