web-dev-qa-db-ja.com

未チェックの例外またはランタイム例外の違い

これはインタビューの質問でした。チェックされていない例外とエラーはどちらもキャッチされないため、主な違いは何ですか?彼らはプログラムを終了します。

33
giri

名前で述べたように、チェックされていない例外は、コンパイル時にチェックされませんコンパイル時、つまりコンパイラメソッドをキャッチしたり、それらを(throwsで)指定したりする必要はありません。このカテゴリに属する​​クラスの詳細は、JLSのセクション 11.2例外のコンパイル時チェック にあります。

未チェックの例外クラスは、クラスRuntimeExceptionとそのサブクラス、およびクラスErrorとそのサブクラスです。他のすべての例外クラスは、チェックされた例外クラスです。 Java APIは、チェック済みとチェックなしの両方の多数の例外クラスを定義します。チェック済みとチェックなしの両方の追加の例外クラスは、プログラマーが宣言できます。詳細は §11.5 を参照してください例外クラス階層の説明と、Java APIおよびJava仮想マシンによって定義されたいくつかの例外クラス。

次の図は、例外階層を示しています。

alt text

クラスErrorとそのサブクラスは、通常のプログラムが通常回復することを期待されない例外であり、 11.5例外階層 で説明されています。

クラスErrorThrowableの別個のサブクラスであり、クラス階層のExceptionとは異なり、プログラムがイディオムを使用できるようにします。

} catch (Exception e) {

通常は回復できないエラーをキャッチせずに、回復が可能なすべての例外をキャッチします。

要約すると、RuntimeExceptionは、回復が可能な例外の未チェックの例外のサブセットです(ただし、未チェックの例外はRuntimeExceptionの同義語ではありません。多くはここで答えています)。

60
Pascal Thivent

JavaDocsはこれらをかなりよくまとめています。

Java.lang.RuntimeException

RuntimeExceptionは、Java仮想マシンの通常の操作中にスローされる可能性がある例外のスーパークラスです。

メソッドのthrows句で、メソッドの実行中にスローされてもキャッチされないRuntimeExceptionのサブクラスを宣言する必要はありません。

Java.lang.Error

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

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

「未チェックの例外」はRuntimeExceptionの同義語にすぎないことに注意してください。

9
matt b

注:RuntimeException IS未チェックの例外

チェックされていない例外は、実行のある時点で発生する可能性があることがわかっていてもキャッチされない例外です。たとえば、NullPointerExceptionは、それらをチェックせずにプログラムを終了させると常に発生する可能性があります。コードをtry-catchでラップすることでチェックできますが、これは強制されません(例外が何らかの方法で処理されることを強制するチェック済み例外とは異なります)。

エラーは、実行中の任意の時点で発生する可能性があり、特定のメソッド呼び出しなどによって明示的に引き起こされるわけではないため、実際には捕捉できないものです。たとえば、OutOfMemoryErrorやStackOverflowErrorなどです。これらはどちらもいつでも発生する可能性があり、アプリケーションが終了します。これらのエラーをキャッチしても、回復できない何かが起こったことを示しているため、意味がありません。

4
DaveJohnston

エラー発生してはならない基本的な問題を示します。エラーが発生した場合は、s.th。本当に悪いことが起こりました。
未チェックの例外(実行時の例外)は、例外が何らかの形で予期される可能性がある場合に使用されますが、それに対処する合理的な方法がないため、try catchステートメントは次のようになります。ただ迷惑でスペースの無駄です。

3
user306708

チェック例外:

  • ThrowableおよびRuntimeException以外のErrorクラスを拡張するクラスは、チェック例外と呼ばれます。
  • これらのタイプの例外はコンパイル時にチェックされるため、コンパイル時例外とも呼ばれます。つまり、これらの例外を無視すると(_try/catch_またはthrow例外では処理されません)、コンパイルエラーが発生します。
  • これらは、コードの制御外の予期しない状況(データベースのダウン、ファイルI/Oエラー、誤った入力など)によって引き起こされる、プログラムで回復可能な問題です。
  • _try/catch_ブロックを使用することで回避できます。
  • 例:IOExceptionSQLExceptionなど

未チェックの例外:

  • RuntimeExceptionを拡張するクラスは、チェックされない例外と呼ばれます
  • 未チェックの例外は、実行時にチェックされるのではなく、コンパイル時にチェックされません。そのため、それらも呼び出されます「ランタイム例外」
  • これらはプログラムで回復可能な問題でもありますが、チェック例外とは異なり、コードフローまたは構成の障害が原因です。
  • 例:ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsExceptionなど
  • それらはプログラミングエラーなので、うまくコーディングすることで回避できます。たとえば、「ゼロ除算」はArithmeticEceeptionになります。単純なif条件-if(divisor!=0)で回避できます。同様に、参照をチェックするだけでNullPointerExceptionを回避できます-if(object!=null)または より優れた手法

エラー:

  • Errorは、try/catchで処理されていない回復不可能な状況を示します
  • 例:OutOfMemoryErrorVirtualMachineErrorAssertionErrorなど。
3
Razib

エラー:これらは、アプリケーションにとって外部である例外的な条件であり、通常、アプリケーションは予測も回復もできません。

ランタイム例外:これらは、アプリケーションにとって内部である例外的な条件です、また、アプリケーションは通常、予測も回復もできません。

あなたは読みたいかもしれません this

2
Vineeta Khatuja

エラーとランタイム例外は、まとめてチェックされない例外と呼ばれます。

ランタイム例外は、アプリケーションの内部にある例外的な状態であり、アプリケーションは通常、予期したり、そこから回復したりすることはできません。これらは通常、論理エラーやAPIの不適切な使用など、プログラミングのバグを示しています

3種類の例外について説明しているこのリンクをご覧ください。

http://docs.Oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

これがお役に立てば幸いです。

1
grepit

RuntimeExceptionsおよびOutOfMemoryErrorのようなエラーはキャッチする必要がなく、アプリケーションを終了するmain()に到達するまでスローできます。

その他の例外がキャッチされなかったり、スローリストに含まれていなかったりすると、コンパイルエラーが発生します。

1
stacker