web-dev-qa-db-ja.com

例外とエラーの違い

基本的なJavaとさまざまな種類のThrowableについてさらに詳しく学習しようとしていますが、例外とエラーの違いを誰かに教えてもらえますか?

156
Marco Leung

エラーをキャッチまたは処理しないでください(ごくまれなケースを除きます)。例外は、例外処理の基本です。 Javadoc はそれをうまく説明しています:

エラーはThrowableのサブクラスであり、合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示します。そのようなエラーのほとんどは異常な状態です。

Errorのいくつかのサブクラスを見て、JavaDocコメントをいくつか取ってください。

  • AnnotationFormatError-アノテーションパーサーがクラスファイルからアノテーションを読み取ろうとし、アノテーションの形式が正しくないと判断した場合にスローされます。
  • AssertionError-アサーションが失敗したことを示すためにスローされます。
  • LinkageError-LinkageErrorのサブクラスは、クラスが別のクラスに依存していることを示します。ただし、後者のクラスは、前者のクラスのコンパイル後に互換性のない変更が加えられています。
  • VirtualMachineError-Java仮想マシンが壊れているか、動作を継続するために必要なリソースが不足していることを示すためにスローされます。

Throwableには、本当に3つの重要なサブカテゴリがあります。

  • Error-重大な問題が発生したため、ほとんどのアプリケーションは問題を処理しようとするのではなくクラッシュします。
  • 未チェックの例外(別名RuntimeException)-NullPointerExceptionや不正な引数などのプログラミングエラーが非常に頻繁に発生します。アプリケーションは、このThrowableカテゴリを処理または回復できます。あるいは、少なくともスレッドのrun()メソッドでキャッチして、苦情をログに記録し、実行を継続できます。
  • Checked Exception(aka Everything)-アプリケーションは、FileNotFoundExceptionTimeoutException...など、残りをキャッチして意味のあることを実行できることが期待されます。
164
Eddie

この Javaの例外階層を示すスライド by @ georgios-gousios は、Javaのエラーと例外の違いを簡潔に説明しています。

Java Exception Hierarchy

31
avandeursen

エラーは、ご存知のようにアプリケーションの終了を知らせる傾向があります。通常は回復できないため、VMを終了する必要があります。終了する前に、適切なメッセージを記録または表示する場合を除いて、それらをキャッチしないでください。

例:OutOfMemoryError-プログラムが実行できなくなるため、できることはあまりありません。

例外は多くの場合回復可能であり、回復できない場合でも、通常は試行された操作が失敗したことを意味しますが、プログラムは引き続き実行できます。

例:IllegalArgumentException-メソッド呼び出しに失敗するように無効なデータをメソッドに渡しましたが、将来の操作には影響しません。

これらは単純な例であり、例外だけに関する情報も豊富にあります。

17
Robin

最高に置く

エラーはThrowableのサブクラスであり、合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示します。

7
Powerlord

エラー -

  1. JavaのErrorsはJava.lang.Error型です。
  2. Javaのすべてのエラーはチェックされていないタイプです。
  3. Errorsは実行時に発生します。コンパイラーには認識されません。
  4. エラーから回復することは不可能です。
  5. Errorsは、主にアプリケーションが実行されている環境によって引き起こされます。
  6. 例:Java.lang.StackOverflowErrorJava.lang.OutOfMemoryError

例外 -

  1. JavaのExceptionsはJava.lang.Exception型です。
  2. Exceptionsには、チェック済みと未チェックの両方のタイプが含まれます。
  3. チェックされた例外はコンパイラーに知られており、未チェックの例外は実行時に発生するためコンパイラーには知られていません。
  4. try-catchブロックを介して例外を処理することにより、例外から回復できます。
  5. Exceptionsは、主にアプリケーション自体が原因です。
  6. 例:チェックされた例外:SQLExceptionIOException
    未チェックの例外:ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException

さらに読む: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-Java/http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

5
roottraveller

Errorクラスの説明は非常に明確です。

Errorは、Throwableのサブクラスであり、合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示します。そのようなエラーのほとんどは異常な状態です。 ThreadDeathエラーは、「通常の」状態ですが、ほとんどのアプリケーションがキャッチしようとしないため、Errorのサブクラスでもあります。

メソッドは、メソッドの実行中にスローされるがキャッチされないErrorのサブクラスをthrows節で宣言する必要はありません。これらのエラーは決して発生しない異常な状態であるためです。

Java独自の クラスErrorのドキュメント から引用。

要するに、Errorsをキャッチするべきではありませんが、そうする正当な理由がある場合を除きます。 (たとえば、サーブレットのメモリ不足などが発生した場合にWebサーバーの実装がクラッシュするのを防ぐため)

一方、Exceptionは、他の現代言語と同様に、通常の例外です。詳細な説明は、Java AP​​Iドキュメントまたはオンラインまたはオフラインのリソースにあります。

3
Tobias Müller

クラスJava.lang.ExceptionJava.lang.Errorにはいくつかの類似点と相違点があります。

類似性:

  • まず、両方のクラスがJava.lang.Throwableを拡張し、その結果、次のようなエラーを処理するときに使用される一般的なメソッドの多くを継承します:getMessagegetStackTraceprintStackTraceなど。

  • 第二に、Java.lang.Throwableのサブクラスであるため、両方とも次のプロパティを継承します。

    • Throwable自体とそのサブクラス(Java.lang.Errorを含む)は、throwsキーワードを使用してメソッド例外リストで宣言できます。このような宣言は、Java.lang.Exceptionおよびサブクラス、Java.lang.ThrowableJava.lang.ErrorおよびJava.lang.RuntimeExceptionおよびそれらのサブクラスに対してのみ必要であり、オプションです。

    • catch句で使用できるのは、Java.lang.Throwableおよびサブクラスのみです。

    • キーワードthrowで使用できるのは、Java.lang.Throwableおよびサブクラスのみです。

このプロパティの結論は、Java.lang.ErrorJava.lang.Exceptionの両方がメソッドヘッダーで宣言でき、catch句で使用でき、キーワードthrowで使用できるということです。

違い:

  • まず-概念的な違い:Java.lang.ErrorはJVMによってスローされ、深刻な問題を示し、キャッチされるのではなくプログラムの実行を停止するように設計されています(ただし、他のJava.lang.Throwable後継者については可能です)。

    javadoc からの説明Java.lang.Errorに関する説明:

    ...合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示します。

    反対のJava.lang.Exceptionは、予想されるエラーを表すように設計されており、プログラムの実行を終了せずにプログラマーが処理できます。

    javadoc からの説明Java.lang.Exceptionに関する説明:

    ...合理的なアプリケーションがキャッチしたい条件を示します。

  • コンパイル時の例外チェックでunchecked例外と最初に見なされたJava.lang.ErrorJava.lang.Exceptionの2番目の違い。 Java.lang.Errorまたはそのサブクラスをスローする結果コードは、メソッドヘッダーでこのエラーを宣言する必要がありません。メソッドヘッダーでJava.lang.Exceptionが必要な宣言をスローしている間。

Throwableとその後続クラスの図(プロパティとメソッドは省略されています)。 enter image description here

2

IMOエラーは、アプリケーションの失敗を引き起こす可能性があるため、処理しないでください。例外とは、予測不能な結果を​​引き起こす可能性があるものの、回復できるものです。

例:

プログラムがメモリ不足になると、アプリケーションが続行できないためエラーになります。ただし、プログラムが誤った入力タイプを受け入れる場合、プログラムはそれを処理し、正しい入力タイプを受信するようにリダイレクトできるため、例外です。

1
Mr. Will

エラーの主な原因は、アプリケーションが実行されている環境です。たとえば、JVMがメモリ不足になるとOutOfMemoryErrorが発生し、スタックがオーバーフローするとStackOverflowErrorが発生します。

例外は主にアプリケーション自体が原因です。たとえば、アプリケーションがnullオブジェクトにアクセスしようとするとNullPointerExceptionが発生し、アプリケーションが互換性のないクラス型をキャストしようとするとClassCastExceptionが発生します。

ソース: Javaでのエラーと例外の違い

0
user2485429

エラーと例外が表すJava AP​​Iのかなり良い要約を以下に示します。

エラーはThrowableのサブクラスであり、合理的なアプリケーションがキャッチしようとしてはならない重大な問題を示します。そのようなエラーのほとんどは異常な状態です。 ThreadDeathエラーは、「通常の」状態ですが、ほとんどのアプリケーションがキャッチしようとしないため、Errorのサブクラスでもあります。

メソッドは、メソッドの実行中にスローされるがキャッチされない可能性のあるErrorのサブクラスをthrows句で宣言する必要はありません。これらのエラーは決して発生しない異常な状態だからです。

OTOH、例外の場合、Java AP​​Iのコメント:

クラスExceptionとそのサブクラスはThrowableの形式であり、合理的なアプリケーションがキャッチしたい条件を示します。

0
egaga