例外とエラーの違い


173

基本的なJavaとさまざまなタイプのThrowableについて詳しく知りたいのですが、例外とエラーの違いを誰かに教えてもらえますか?

回答:


178

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

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

ErrorJavaDocコメントの一部を取りながら、のサブクラスのいくつかを見てください。

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

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

  • Error -深刻な問題が発生したため、ほとんどのアプリケーションは問題を処理するのではなくクラッシュするはずです。
  • 未チェックの例外(別名RuntimeException)- NullPointerExceptionまたは、不正な引数などのプログラミングエラー。アプリケーションはこのThrowableカテゴリを処理または回復できる場合があります-または、少なくともスレッドのrun()メソッドでそれをキャッチし、苦情をログに記録して、実行を継続できます。
  • チェック例外は、(他のすべて別名) -アプリケーションは、次のような、キャッチし、意味の残りの部分と何かを行うことができると期待されているFileNotFoundExceptionTimeoutException...

10
オラクルはそれを言いUnchecked exceptions != RuntimeExceptionsます。Unchecked exceptions = RuntimeExceptions + Errors。私はそれが問題を提起することを知っていますエラーは例外ですか?、しかしこれは彼らが書いたものです。ここにそれらの例の1つを示します:docs.oracle.com/javase/tutorial/essential/exceptions/…
ROMANIA_engineer 2016年

1
未回答の質問は、RuntimeExceptionとErrorは本質的にどのように違うのですか?どちらもチェックされておらず、他のすべての点で同等です。
Pacerier 2017

38

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

Java例外階層


6
誰かがNullPointerExceptionから回復するのを見たいです:D:D:D
Ignacio Soler Garcia

2
@IgnacioSolerGarciaそれは可能であり、それは理にかなっています(他の質問はそれが良いかどうかです)。通常、オブジェクトが存在するかどうかを確認し、その後、メソッドを呼び出すか、フィールドを使用します。ただし、存在を確認する代わりに、NPEをキャッチしてみることができます。そして、それについてのメッセージをログに記録して、例えば続けてください。
Gangnus

@Gangnus:意味がありません。例外はコードの一部をスキップし、通常の操作ではなくエラーを報告する方法であることを忘れないでください
Ignacio Soler Garcia

17

エラーは、ご存じのとおり、アプリケーションの終了を知らせる傾向があります。これは通常、復旧できず、VMを終了させるはずです。終了する前に、おそらくログまたは表示と適切なメッセージを除いて、それらをキャッチするべきではありません。

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

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

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

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


として、examples.javacodegeeks.com / java-basics / exceptions /…を見てください。IllegalArgumentExceptionはランタイム例外であり、エラーではありません。docs.oracle.com/javase/7/docs/api/java/lang/...
Gangnus

8

エラー -

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

例外 -

  1. ExceptionJavaのはタイプ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



3

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

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

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

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

つまり、Error正当な理由がある場合を除いて、sをキャッチしないでください。(たとえば、サーブレットでメモリ不足などが発生した場合に、Webサーバーの実装がクラッシュするのを防ぐためです。)

アンはException、他の一方で、他の近代的な言語のように、ごく普通の例外です。詳細については、Java APIのドキュメント、またはオンラインまたはオフラインのリソースを参照してください。


2

クラスjava.lang.Exceptionとにはいくつかの類似点と相違点がありjava.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、オプションです。

    • java.lang.Throwableで使用できるのはサブクラスのみcatchです。

    • java.lang.Throwableおよびサブクラスのみがキーワード-で使用できますthrow

このプロパティからの結論は両方に従ってjava.lang.Errorおりjava.lang.Exception、メソッドヘッダーで宣言でき、catch句で使用でき、keywordで使用できますthrow

違い:

  • 最初-概念的な違い:java.lang.ErrorJVMによってスローされ、重大な問題を示すように設計されており、キャッチされるのではなくプログラムの実行を停止することを意図しています(ただし、他のjava.lang.Throwable後続操作と同様に可能です)。

    についてのjavadoc記述からの一節java.lang.Error

    ...合理的なアプリケーションがキャッチしようとすべきではない深刻な問題を示します。

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

    についてのjavadoc記述からの一節java.lang.Exception

    ...適切なアプリケーションがキャッチする可能性のある条件を示します。

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

Throwableとその後継クラス図(プロパティとメソッドは省略)。 ここに画像の説明を入力してください


1

IMOエラーは、アプリケーションが失敗する原因となる可能性があるため、処理する必要はありません。例外は、予期しない結果を引き起こす可能性があるものですが、そこから回復することができます。

例:

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


1

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

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

出典:Javaでのエラーと例外の違い


「エラーは主にアプリケーションが実行されている環境が原因です」および「例外は主にアプリケーション自体が原因です」完璧!
ADJ

0

エラーと例外が何を表すかについて、Java APIからのかなり良い要約を以下に示します。

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

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

OTOH、例外について、Java APIは次のように述べています。

クラスExceptionおよびそのサブクラスは、合理的なアプリケーションがキャッチする可能性のある条件を示すThrowableの形式です。


0

エラーは、アプリケーションまたはプログラムが実行される環境が原因で発生します。ほとんどの場合、アプリケーションまたはプログラムが終了するため、回復できません。Javadocは、JVMなどの環境でこのようなエラーが発生した場合でも終了するため、そのようなエラーをキャッチする必要がないことを推奨しています。

例: VirtualMachineError-Java仮想マシンが壊れているか、Java仮想マシンが動作を継続するために必要なリソースを使い果たしたことを示すためにスローされます。 OutOfMemoryErrorJVMがメモリ不足になるか、 StackOverflowError、スタックが実行されると発生します。

例外は、アプリケーションまたはプログラム自体によって引き起こされます。多分あなた自身のミスが原因です。ほとんどの場合、そこから回復でき、アプリケーションは引き続き実行されます。このようなエラーをキャッチして、アプリケーションまたはプログラムの異常終了を防止したり、例外メッセージをカスタマイズしたりして、デフォルトの醜い例外メッセージではなく、適切にフォーマットされたメッセージが表示されるようにすることをお勧めします。

例: NullPointerExceptionアプリケーションがnullオブジェクトにアクセスしようとしたときに発生します。または存在しないインデックスを持つ配列にアクセスしようとしたか、間違ったデータまたはパラメーターで関数を呼び出しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.