基本的な Java とさまざまなタイプの Throwable についてもっと学ぼうとしています。誰かが例外とエラーの違いを教えてもらえますか?
11 に答える
エラーをキャッチしたり処理したりしないでください (ごくまれな場合を除きます)。例外は、例外処理のパンとバターです。Javadocはそれをよく説明しています:
Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。
のサブクラスError
をいくつか見て、JavaDoc コメントをいくつか取り上げます。
AnnotationFormatError
- 注釈パーサーがクラス ファイルから注釈を読み取ろうとして、注釈の形式が正しくないと判断した場合にスローされます。AssertionError
- アサーションが失敗したことを示すためにスローされます。LinkageError
- LinkageError のサブクラスは、あるクラスが別のクラスに依存していることを示します。ただし、後者のクラスは、前者のクラスのコンパイル後に非互換に変更されています。VirtualMachineError
- Java 仮想マシンが壊れているか、動作を継続するために必要なリソースが不足していることを示すためにスローされます。
には、実際には 3 つの重要なサブカテゴリがありますThrowable
。
Error
- 問題を処理しようとするのではなく、ほとんどのアプリケーションがクラッシュするほど深刻な問題が発生した。- Unchecked Exception (別名) - 非常に多くの場合、または不正な引数
RuntimeException
などのプログラミング エラーです。NullPointerException
アプリケーションは、このThrowable
カテゴリを処理または回復できる場合があります。または、少なくともスレッドのrun()
メソッドでそれをキャッチし、苦情をログに記録して、実行を継続できます。 - Checked Exception (aka Everything else) - アプリケーションは、キャッチして残りの何かを有意義に処理できることが期待されてい
FileNotFoundException
ますTimeoutException
。
@georgios-gousios によるJava の例外階層を示すこのスライドは、Java のエラーと例外の違いを簡潔に説明しています。
エラーは、ご存じのとおり、アプリケーションの終了を知らせる傾向があります。通常、これは回復できず、VM が終了する原因となります。それらをキャッチすることは、終了する前にログまたは表示と適切なメッセージを除いて行うべきではありません。
例: OutOfMemoryError - プログラムが実行できなくなったため、できることはあまりありません。
多くの場合、例外は回復可能であり、そうでない場合でも、通常は試行された操作が失敗したことを意味しますが、プログラムは続行できます。
例: IllegalArgumentException - 無効なデータがメソッドに渡されたため、メソッド呼び出しは失敗しましたが、今後の操作には影響しません。
これらは単純な例であり、例外だけでも豊富な情報があります。
Sunは次のように述べています。
Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。
クラスの説明Error
は非常に明確です。
An
Error
は のサブクラスでありThrowable
、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。エラーはThreadDeath
、「通常の」状態ですがError
、ほとんどのアプリケーションがエラーをキャッチしようとしないため、 のサブクラスでもあります。メソッドは、メソッドの実行中にスローされる可能性があるがキャッチされないサブクラスを throws 節で宣言する必要はありません
Error
。これらのエラーは決して発生してはならない異常な状態であるためです。
クラスの Java 独自のドキュメントError
から引用。
Error
つまり、正当な理由がない限り、s をキャッチするべきではありません。(たとえば、サーブレットがメモリ不足などで実行された場合に Web サーバーの実装がクラッシュするのを防ぐため。)
Exception
一方、 は、他の現代言語と同様に、通常の例外です。詳細な説明については、Java API ドキュメントまたはオンラインまたはオフラインのリソースを参照してください。
IMOエラーは、アプリケーションが失敗する原因となる可能性があり、処理すべきではありません。例外は、予測できない結果を引き起こす可能性がありますが、回復できるものです。
例:
プログラムがメモリ不足になった場合、アプリケーションを続行できないため、エラーになります。ただし、プログラムが誤った入力タイプを受け入れる場合、プログラムはそれを処理し、リダイレクトして正しい入力タイプを受け取ることができるため、例外です。
エラーと例外が何を表すかを Java API から非常によくまとめたものを次に示します。
Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。ThreadDeath エラーは、「通常の」状態ですが、ほとんどのアプリケーションがキャッチしようとしないため、Error のサブクラスでもあります。
メソッドの throws 句で、メソッドの実行中にスローされる可能性があるが捕捉されない可能性がある Error のサブクラスを宣言する必要はありません。これらのエラーは決して発生してはならない異常な状態であるためです。
OTOH、例外について、Java APIは次のように述べています。
クラス Exception とそのサブクラスは、適切なアプリケーションがキャッチする可能性がある条件を示す Throwable の形式です。