質問

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

役に立ちましたか?

解決

エラーは捕捉または処理されるべきではありません (最もまれなケースを除いて)。例外は例外処理の基本です。の Javadoc それをうまく説明しています:

エラーは、合理的なアプリケーションがキャッチしようとすべきではない深刻な問題を示すスロー可能なサブクラスです。そのようなエラーのほとんどは異常な条件です。

のサブクラスをいくつか見てみましょう Error, 、JavaDoc コメントの一部を抜粋します。

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

実際には 3 つの重要なサブカテゴリがあります Throwable:

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

他のヒント

Javaの例外階層を示す

このスライド @によって簡潔にJavaでエラーと例外の違いを説明しゲオルギオス・gousiosます。

 Javaの例外階層

エラーは、あなたがそれを知っているように、アプリケーションの終了を通知する傾向があります。それは、典型的には、から回復することはできませんし、あなたのVMを終了させなければなりません。それらをキャッチする可能性が終了する前にログインしたり、表示し、適切なメッセージを除いて行われるべきではありません。

例: OutOfMemoryErrorのの - あまりあなたがあなたのプログラムとして行うことができますが、もはや実行できません。

例外は、彼らは一般的にちょうどしようとした操作が失敗した意味が、あなたのプログラムがまだ続けていくことができない場合でも、回復可能としばしばです。

例: IllegalArgumentException の - 。メソッドの呼び出しが失敗したように、メソッドに無効なデータが渡され、それが将来の事業に影響を与えません。

これらは単純な例であり、一人だけ例外に関する情報の別の富があります。

は最高にそれを置きます:

  

エラーはThrowableのサブクラスであります   それはその重大な問題を示し、   合理的なアプリケーションが試みるべきではありません   キャッチする。

エラー -

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

例外 -

  1. ExceptionJava の は次の型です java.lang.Exception.
  2. Exceptions には、チェックされたタイプとチェックされていないタイプの両方が含まれます。
  3. チェック例外はコンパイラに認識されますが、非チェック例外は実行時に発生するため、コンパイラには認識されません。
  4. 例外を処理することで例外から回復できます。 try-catch ブロック。
  5. Exceptionは主にアプリケーション自体が原因で発生します。
  6. 例: チェックされた例外: SQLException, IOException
    未チェックの例外: ArrayIndexOutOfBoundException, ClassCastException, NullPointerException

参考文献 : http://javaconceptoftheday.com/difference-between-error-vs-Exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

Errorクラスの説明は非常に明確である:

  

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

     

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

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

あなたがそうする正当な理由を持っている以外

要するに、あなたは、Errorsをキャッチしてはいけません。 (例えば、サーブレットはメモリまたはそのような何かが不足した場合クラッシュするWebサーバの実装を防止することができる。)

Exceptionは、他の一方で、他の近代的な言語のように、ごく普通の例外です。あなたは、JavaのAPIドキュメントまたは任意のオンラインまたはオフラインのリソースで詳細を説明します。

クラス間にはいくつかの類似点と相違点があります java.lang.Exception そして java.lang.Error.

類似点:

  • まず - 両方のクラスが拡張されます java.lang.Throwable その結果、次のようなエラーを扱うときに使用される一般的な多くの方法を継承します。 getMessage, getStackTrace, printStackTrace 等々。

  • 第二に、のサブクラスとして java.lang.Throwable 彼らは両方とも次のプロパティを継承します:

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

    • のみ java.lang.Throwable およびサブクラスでの使用が許可されています。 catch 句。

    • のみ java.lang.Throwable サブクラスはキーワードと一緒に使用できます - throw.

この特性からの結論は両方に従う java.lang.Error そして java.lang.Exception メソッドヘッダーで宣言できます。 catch 句、キーワードと一緒に使用できます throw.

違い:

  • 第一 - 概念的な違い: java.lang.Error JVMによって投げられるように設計され、深刻な問題を示し、キャッチされる代わりにプログラムの実行を停止することを意図しています(ただし、他の場合は可能です java.lang.Throwable 後継)。

    からの一節 Javadoc についての説明 java.lang.Error:

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

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

    からの一節 Javadoc についての説明 java.lang.Exception:

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

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

Throwable とその後継クラスの図 (プロパティとメソッドは省略)。enter image description here

IMOのエラーは、アプリケーションが失敗する可能性がありますと扱われるべきではない何かです。例外は、予期しない結果を引き起こすことができるものですが、から回収することができます。

例:

プログラムは、メモリが不足している場合は、アプリケーションが続行できませんとして

それは誤りです。プログラムが正しく入力タイプを受け入れる場合、プログラムはそれを処理し、正しい入力タイプを受信するようにリダイレクトすることができるようにしかし、それは例外である。

ここでエラーと例外が何を表すかのJava APIからかなり良い要約です

  

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

     

の方法はで宣言する必要はありません   その句に任意のサブクラスをスローします   中にスローされる可能性がありますエラー   メソッドの実行ではなく、   これらのエラーであるため、キャッチ   それいけ異常な状態   発生します。

大藤、例外のために、JavaのAPIは述べています:

  

Exceptionクラスとそのサブクラスは、通常のアプリケーションでキャッチされる可能性のある状態を示すThrowableの形式の1つです。

エラーは主に、アプリケーションが実行されている環境によって引き起こされます。 JVMは、メモリの不足またはスタックがオーバフローしたときにStackOverflowErrorが発生した場合、例えば、OutOfMemoryErrorが発生します。

例外は、主にアプリケーション自体によって引き起こされます。アプリケーションは、NULLオブジェクトにアクセスしようとまたはアプリケーションが互換性のないクラスタイプをキャストしようとしたときにClassCastExceptionが発生した場合、例えば、NullPointerExceptionが発生します。

ソース:Javaのの中の例外対誤差と違い

scroll top