これはインタビューの質問でした。チェックされていない例外とエラーはどちらもキャッチされないため、主な違いは何ですか?彼らはプログラムを終了します。
名前で述べたように、チェックされていない例外は、コンパイル時にチェックされませんコンパイル時、つまりコンパイラメソッドをキャッチしたり、それらを(throws
で)指定したりする必要はありません。このカテゴリに属するクラスの詳細は、JLSのセクション 11.2例外のコンパイル時チェック にあります。
未チェックの例外クラスは、クラス
RuntimeException
とそのサブクラス、およびクラスError
とそのサブクラスです。他のすべての例外クラスは、チェックされた例外クラスです。 Java APIは、チェック済みとチェックなしの両方の多数の例外クラスを定義します。チェック済みとチェックなしの両方の追加の例外クラスは、プログラマーが宣言できます。詳細は §11.5 を参照してください例外クラス階層の説明と、Java APIおよびJava仮想マシンによって定義されたいくつかの例外クラス。
次の図は、例外階層を示しています。
クラスError
とそのサブクラスは、通常のプログラムが通常回復することを期待されない例外であり、 11.5例外階層 で説明されています。
クラス
Error
はThrowable
の別個のサブクラスであり、クラス階層のException
とは異なり、プログラムがイディオムを使用できるようにします。} catch (Exception e) {
通常は回復できないエラーをキャッチせずに、回復が可能なすべての例外をキャッチします。
要約すると、RuntimeException
は、回復が可能な例外の未チェックの例外のサブセットです(ただし、未チェックの例外はRuntimeException
の同義語ではありません。多くはここで答えています)。
JavaDocsはこれらをかなりよくまとめています。
RuntimeExceptionは、Java仮想マシンの通常の操作中にスローされる可能性がある例外のスーパークラスです。
メソッドのthrows句で、メソッドの実行中にスローされてもキャッチされないRuntimeExceptionのサブクラスを宣言する必要はありません。
ErrorはThrowableのサブクラスであり、妥当なアプリケーションがキャッチしようとしてはならない重大な問題を示します。このようなエラーのほとんどは異常な状態です。 ThreadDeathエラーは、「通常の」条件ですが、ほとんどのアプリケーションがエラーをキャッチしようとしてはならないため、Errorのサブクラスでもあります。
これらのエラーは発生してはならない異常な状態であるため、メソッドのスロー句でメソッドの実行中にスローされてもキャッチされない可能性のあるErrorのサブクラスをメソッドで宣言する必要はありません。
「未チェックの例外」はRuntimeException
の同義語にすぎないことに注意してください。
注:RuntimeException IS未チェックの例外
チェックされていない例外は、実行のある時点で発生する可能性があることがわかっていてもキャッチされない例外です。たとえば、NullPointerExceptionは、それらをチェックせずにプログラムを終了させると常に発生する可能性があります。コードをtry-catchでラップすることでチェックできますが、これは強制されません(例外が何らかの方法で処理されることを強制するチェック済み例外とは異なります)。
エラーは、実行中の任意の時点で発生する可能性があり、特定のメソッド呼び出しなどによって明示的に引き起こされるわけではないため、実際には捕捉できないものです。たとえば、OutOfMemoryErrorやStackOverflowErrorなどです。これらはどちらもいつでも発生する可能性があり、アプリケーションが終了します。これらのエラーをキャッチしても、回復できない何かが起こったことを示しているため、意味がありません。
エラー発生してはならない基本的な問題を示します。エラーが発生した場合は、s.th。本当に悪いことが起こりました。
未チェックの例外(実行時の例外)は、例外が何らかの形で予期される可能性がある場合に使用されますが、それに対処する合理的な方法がないため、try catchステートメントは次のようになります。ただ迷惑でスペースの無駄です。
チェック例外:
Throwable
およびRuntimeException
以外のError
クラスを拡張するクラスは、チェック例外と呼ばれます。try/catch
_またはthrow
例外では処理されません)、コンパイルエラーが発生します。try/catch
_ブロックを使用することで回避できます。IOException
、SQLException
など未チェックの例外:
RuntimeException
を拡張するクラスは、チェックされない例外と呼ばれますArithmeticException
、NullPointerException
、ArrayIndexOutOfBoundsException
などArithmeticEceeption
になります。単純なif条件-if(divisor!=0)
で回避できます。同様に、参照をチェックするだけでNullPointerException
を回避できます-if(object!=null)
または より優れた手法エラー:
Error
は、try/catchで処理されていない回復不可能な状況を示しますOutOfMemoryError
、VirtualMachineError
、AssertionError
など。エラー:これらは、アプリケーションにとって外部である例外的な条件であり、通常、アプリケーションは予測も回復もできません。
ランタイム例外:これらは、アプリケーションにとって内部である例外的な条件です、また、アプリケーションは通常、予測も回復もできません。
あなたは読みたいかもしれません this :
エラーとランタイム例外は、まとめてチェックされない例外と呼ばれます。
ランタイム例外は、アプリケーションの内部にある例外的な状態であり、アプリケーションは通常、予期したり、そこから回復したりすることはできません。これらは通常、論理エラーやAPIの不適切な使用など、プログラミングのバグを示しています
3種類の例外について説明しているこのリンクをご覧ください。
http://docs.Oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
これがお役に立てば幸いです。
RuntimeExceptions
およびOutOfMemoryError
のようなエラーはキャッチする必要がなく、アプリケーションを終了するmain()に到達するまでスローできます。
その他の例外がキャッチされなかったり、スローリストに含まれていなかったりすると、コンパイルエラーが発生します。