web-dev-qa-db-ja.com

RuntimeExceptionおよびエラー

例外階層では、 RuntimeException の子孫と Error の子孫は実行時の例外/エラーです。

2つの違いは次のとおりです。 RuntimeException の下にあるものは、プログラミング/設計が不十分なために発生したものであり、 Error の下のものは、開発者が制御できない/すべきでないもの。

アプリケーション内で例外をコーディングする場合、たとえば、ビジネスロジックで何かが発生したときに例外をスローするように、 RuntimeException が拡張されています。

問題は、拡張 RuntimeException と拡張 Error -の違いは何ですか? Error は悪い習慣ですか?

22
Roam

ErrorRuntimeExceptionは両方ともチェックされていない例外であり、これはプログラムの欠陥を示しており、通常は検出されません。 (NullPointerExceptionIndexOutOfBoundsExceptionなど)

この2つの主な違いは、RuntimeExceptionはプログラムにエラーがあることを示し、Errorは致命的ですがプログラムの制御外のものであることです。 (OutOfMemorryErrorThreadDeathなど)

したがってErrorをサブクラス化することは悪い習慣です。エラーは通常、実行時にプログラムで修正できるものではないためです。プログラムでは、何かをスローする必要がある場合は、Exceptionを使用します。

21
Pita

Qは、RuntimeExceptionの拡張とErrorの拡張の正確な違いは何ですか?ただし、Errorの拡張は悪い習慣です。

主な違いについてはすでに説明しました。 Java言語仕様は同じことを別の言葉で言っていますErrorについては、

Errorは、通常のプログラムが通常回復することが期待されないすべての例外のスーパークラスです

RuntimeExceptionについては、

クラスRuntimeExceptionは、Exceptionの直接のサブクラスです。 RuntimeExceptionは、式の評価中にさまざまな理由でスローされる可能性があるすべての例外のスーパークラスですが、そこから回復が可能である可能性があります

これらの引用から取り除くべきことは、一般的に

try {
   ...
} catch (Exception e) { // catches RuntimeException
   ...
}

ExceptionRuntimeExceptionのスーパータイプであるため、すべてのケースをキャッチします。しかし、あなたはほとんど見ないでしょう(私はそれを見たことがありません)

try {
   ...
} catch (Error e) {
   ...
}