質問
基本的な Java とさまざまなタイプの Throwable について詳しく学ぼうとしています。誰かが例外とエラーの違いを教えてもらえますか?
解決
エラーは捕捉または処理されるべきではありません (最もまれなケースを除いて)。例外は例外処理の基本です。の Javadoc それをうまく説明しています:
エラーは、合理的なアプリケーションがキャッチしようとすべきではない深刻な問題を示すスロー可能なサブクラスです。そのようなエラーのほとんどは異常な条件です。
のサブクラスをいくつか見てみましょう Error
, 、JavaDoc コメントの一部を抜粋します。
AnnotationFormatError
- 注釈パーサーがクラス ファイルから注釈を読み取ろうとし、その注釈が不正な形式であると判断した場合にスローされます。AssertionError
- アサーションが失敗したことを示すためにスローされます。LinkageError
- LinkageError のサブクラスは、クラスが別のクラスに何らかの依存関係があることを示します。ただし、後者のクラスは、前者のクラスのコンパイル後に互換性のない変更が加えられています。VirtualMachineError
- Java 仮想マシンが壊れているか、動作を継続するために必要なリソースが不足していることを示すためにスローされます。
実際には 3 つの重要なサブカテゴリがあります Throwable
:
Error
- 重大な問題が発生したため、ほとんどのアプリケーションは問題を処理しようとするのではなくクラッシュするはずです。- 未チェック例外 (別名)
RuntimeException
) - 非常に多くの場合、次のようなプログラミング エラーが発生します。NullPointerException
または不正な引数。アプリケーションはこれを処理または回復できる場合があります。Throwable
カテゴリ -- または少なくともスレッドでキャッチしてくださいrun()
方法を選択し、苦情を記録し、実行を続行します。 - チェックされた例外 (別名、その他すべて) - アプリケーションは、次のような残りの例外をキャッチし、意味のある処理を実行できることが期待されます。
FileNotFoundException
そしてTimeoutException
...
他のヒント
このスライド @によって簡潔にJavaでエラーと例外の違いを説明しゲオルギオス・gousiosます。
エラーは、あなたがそれを知っているように、アプリケーションの終了を通知する傾向があります。それは、典型的には、から回復することはできませんし、あなたのVMを終了させなければなりません。それらをキャッチする可能性が終了する前にログインしたり、表示し、適切なメッセージを除いて行われるべきではありません。
の例: OutOfMemoryErrorのの - あまりあなたがあなたのプログラムとして行うことができますが、もはや実行できません。
。例外は、彼らは一般的にちょうどしようとした操作が失敗した意味が、あなたのプログラムがまだ続けていくことができない場合でも、回復可能としばしばです。
の例: IllegalArgumentException の - 。メソッドの呼び出しが失敗したように、メソッドに無効なデータが渡され、それが将来の事業に影響を与えません。
これらは単純な例であり、一人だけ例外に関する情報の別の富があります。
日は最高にそれを置きます:
エラーはThrowableのサブクラスであります それはその重大な問題を示し、 合理的なアプリケーションが試みるべきではありません キャッチする。
エラー -
Error
Java の は次の型ですjava.lang.Error
.- Java のエラーはすべて未チェックタイプです。
Error
は実行時に発生します。これらはコンパイラには認識されません。- エラーから回復することは不可能です。
Error
ほとんどの場合、アプリケーションが実行されている環境が原因で発生します。- 例:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
例外 -
Exception
Java の は次の型ですjava.lang.Exception
.Exception
s には、チェックされたタイプとチェックされていないタイプの両方が含まれます。- チェック例外はコンパイラに認識されますが、非チェック例外は実行時に発生するため、コンパイラには認識されません。
- 例外を処理することで例外から回復できます。
try-catch
ブロック。 Exception
は主にアプリケーション自体が原因で発生します。- 例: チェックされた例外:
SQLException
,IOException
未チェックの例外:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
参考文献 : http://javaconceptoftheday.com/difference-between-error-vs-Exception-in-java/
Error
クラスの説明は非常に明確である:
Error
はThrowable
のサブクラスであります それはその重大な問題を示し、 合理的なアプリケーションが試みるべきではありません 捕まえる。ほとんどのこのようなエラーがあります 異常な状態。ThreadDeath
エラーは、「通常」の状態が、あります ほとんどのためError
のもサブクラス アプリケーションではキャッチすべきではありません これます。の方法はで宣言する必要はありません その句に任意のサブクラスをスローします 中にスローされる可能性があります
Error
メソッドの実行ではなく、 これらのエラーであるため、キャッチ それいけ異常な状態 発生します。
クラスError
のJavaの独自のドキュメントから引用のます。
要するに、あなたは、Error
sをキャッチしてはいけません。 (例えば、サーブレットはメモリまたはそのような何かが不足した場合クラッシュする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
メソッドヘッダーでの必須宣言。
IMOのエラーは、アプリケーションが失敗する可能性がありますと扱われるべきではない何かです。例外は、予期しない結果を引き起こすことができるものですが、から回収することができます。
例:
プログラムは、メモリが不足している場合は、アプリケーションが続行できませんとしてそれは誤りです。プログラムが正しく入力タイプを受け入れる場合、プログラムはそれを処理し、正しい入力タイプを受信するようにリダイレクトすることができるようにしかし、それは例外である。
ここでエラーと例外が何を表すかのJava APIからかなり良い要約です
エラーは、通常のアプリケーションでキャッチしようとするべきではない重大な問題を示すThrowableのサブクラスです。ほとんどのこのようなエラーは異常な状態です。ほとんどのアプリケーションがそれをキャッチすべきではないので、ThreadDeathエラーは「正常」状態が、またエラーのサブクラスです。
の方法はで宣言する必要はありません その句に任意のサブクラスをスローします 中にスローされる可能性がありますエラー メソッドの実行ではなく、 これらのエラーであるため、キャッチ それいけ異常な状態 発生します。
大藤、例外のために、JavaのAPIは述べています:
Exceptionクラスとそのサブクラスは、通常のアプリケーションでキャッチされる可能性のある状態を示すThrowableの形式の1つです。
エラーは主に、アプリケーションが実行されている環境によって引き起こされます。 JVMは、メモリの不足またはスタックがオーバフローしたときにStackOverflowErrorが発生した場合、例えば、OutOfMemoryErrorが発生します。
例外は、主にアプリケーション自体によって引き起こされます。アプリケーションは、NULLオブジェクトにアクセスしようとまたはアプリケーションが互換性のないクラスタイプをキャストしようとしたときにClassCastExceptionが発生した場合、例えば、NullPointerExceptionが発生します。
ソース:Javaのの中の例外対誤差と違い