java.lang.RuntimeExceptionとjava.lang.Exceptionの違い


210

誰かがjava.lang.RuntimeExceptionとの違いを説明してくださいjava.lang.Exception。独自の例外を作成する場合、どの拡張するかをどのように決定しますか?

回答:


181

一般に、RuntimeExceptionsは、プログラムで防止できる例外です。例えば NullPointerExceptionArrayIndexOutOfBoundExceptionnullメソッドを呼び出す前に確認すると、NullPointerException発生しません。ArrayIndexOutOfBoundException最初にインデックスをチェックした場合も同様です。RuntimeExceptionコンパイラーによってチェックされないため、クリーンなコードです。

編集:最近の人々はRuntimeExceptionそれが生成するクリーンなコードのために好んでいます。それは完全に個人的な選択です。


10
「実行時の例外は呼び出し元によって回避できたはず」というこの角度が好きです。つまり、(メソッドの呼び出し元として)あなたはそれらが起こらないことを確認することになっています。一方、チェックされた例外は回避できないものであり、代わりに、事後にそれらを処理する必要があります。(もちろん、すべての人がチェック例外の概念に同意しているわけではなく、多くの人がすべてにRuntimeExceptionを使用しているため、この区別は少し混乱しています)。
Thilo 2014年

4
今日では、Java 8 Lambda処理と互換性があるため、チェックされていないRuntimeExceptionも好まれていますが、例外タイプのチェックされた例外はそうではありません。
Hartmut P.

2
人々がキャッチする本当の理由RuntimeExceptionは、それが単純であり、チェックされた例外とチェックされていない例外の違いを考える必要がなくなるためだと思います。のような回復不可能な例外をキャッチするため、ランタイム例外をキャッチすることはひどい考えだと思いますNullPointerException
ドナル

186

Javaには、チェック例外とチェックなし例外の2種類の例外があります。チェックされた例外はコードで明示的に処理する必要がありますが、チェックされていない例外は明示的に処理する必要はありません。

チェック例外の場合、例外をスローする可能性のあるコードの周りにtry / catchブロックを配置するか、メソッドに「throws」句を追加して、メソッドがこのタイプの例外をスローする可能性があることを示す必要があります(呼び出しクラス以上で処理されます)。

「Exception」から派生する例外はすべてチェック済み例外ですが、RuntimeExceptionから派生するクラスはチェックされません。RuntimeExceptionsは、呼び出し元のコードで明示的に処理する必要はありません。


3
実際には「2種類の例外がある」というのは事実ですが、Oracleのドキュメントには3種類の例外があると記載されているのはなぜですか。エラーを3番目のタイプと見なします。エラーはまったく例外ではなく、スロー可能な(オブジェクト)であると思います。実行時例外の動作を模倣しています。あなたはそれについて何を言いますか?Oracleドキュメント。ref。docs.oracle.com/javase/tutorial/essential/exceptions/…–
Asif

3
エラーはキャッチすることを意図したものではありませんが、一般的には、新しいコードに取り組んでいるときに自分のミスをキャッチするためにエラーを使用します。たとえば、if if / elseifステートメントのツリーがある場合、最後のelseは単にError( "この条件が発生することを期待していなかった");をスローします。一般的に言えば、例外にはユースケースがあり、発生することがサポートされていますが、エラーにはユースケースがなく、バグです。
ダニー

5
しかし、冗談はRunTimeException自体がException:Dを拡張することです(これで問題が発生することはなく、JVMがコンテキスト全体を処理します)
Alireza Mohamadi

94

java.lang.RuntimeExceptionjava.lang.Exceptionクラスの違いを見る前に、Exception階層を知っておく必要があります。ExceptionErrorクラスはどちらもclass Throwableから派生しています(classから派生していますObject)。そして、クラスRuntimeExceptionはclass から派生しExceptionます。

すべての例外は、Exceptionまたはから派生しますRuntimeException

派生元のすべての例外RuntimeExceptionは、チェックされていない例外と呼ばれます。そして、他のすべての例外はチェック例外です。チェック例外は、コードのどこかでキャッチする必要があります。そうしないと、コンパイルされません。そのため、それらはチェック例外と呼ばれます。一方、チェックされていない例外がある場合、呼び出しメソッドはそれを処理または宣言する義務がありません。

したがって、コンパイラが処理を強制する例外はすべて直接派生しjava.lang.Exception、コンパイラが処理を強制しない例外はすべてから派生しjava.lang.RuntimeExceptionます。

以下は、RuntimeExceptionの直接既知のサブクラスの一部です

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 

47

Exceptionはチェックされ、RuntimeExceptionはチェックされません。

チェック済みとは、コンパイラが例外をキャッチで処理するか、メソッド(またはそのスーパークラスの1つ)をスローするようにメソッドを宣言する必要があることを意味します。

一般に、APIの呼び出し元が例外を処理することが予想される場合は、チェックされた例外をスローし、パラメータの1つ、つまりプログラミングのエラーなど、呼び出し元が通常処理できないものはチェックされていない例外をスローします。間違い。


15

ランタイム例外クラス(RuntimeExceptionおよびそのサブクラス)は、コンパイラがランタイム例外が発生しないことを確立できないため、コンパイル時チェックから除外されます。(JLSから)。

設計するクラスでは、Exceptionをサブクラス化し、そのインスタンスをスローして、例外的なシナリオを通知する必要があります。そうすることで、クラスを使用すると例外がスローされる可能性があり、例外的なシナリオを処理するための手順を実行する必要があることをクラスのクライアントに明示的に通知します。

以下のコードスニペットは、この点を説明しています。

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

クラスの上のクラス定義ではプロセス、方法はexecute投げることができるのRuntimeExceptionそれが投げるように指定していないメソッドの宣言の必要性のRuntimeExceptionを

メソッドprocessはチェック例外をスローし、MyExceptionの種類のチェック例外をスローすることを宣言する必要があります。そうしないと、コンパイルエラーになります。

上記のクラス定義は、Processクラスを使用するコードにも影響します。

呼び出しnew Process().execute()は有効な呼び出しであり、フォームの呼び出しと同様に new Process().process()コンパイルエラーが発生します。これは、クライアントコードで処理する必要があるためですMyException(たとえば、process()の呼び出しは、try / catchブロックで囲むことができます)。


13

RuntimeExceptionの適切な使用?

未チェックの例外から-論争

クライアントが例外からの回復が合理的に期待できる場合は、チェック済み例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。

チェックされていない例外はから派生したものでRuntimeExceptionあり、チェックされた例外はから派生したものであることに注意してくださいException

RuntimeExceptionクライアントが例外から回復するために何もできない場合、なぜスローするのですか?記事の説明:

ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、例外から回復したり、何らかの方法で処理したりすることは合理的に期待できません。このような問題には、ゼロによる除算などの算術例外が含まれます。null参照を介してオブジェクトにアクセスしようとするなどのポインタ例外。インデックス付けの例外。たとえば、大きすぎるまたは小さすぎるインデックスを使用して配列要素にアクセスしようとした場合。


5

オラクルのドキュメントから:

要点のガイドラインは次のとおりです。クライアントが例外からの回復が合理的に期待できる場合は、チェックされた例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。

ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、例外から回復したり、何らかの方法で処理したりすることは合理的に期待できません。

RuntimeExceptionsは、 "apiの無効な使用による例外"に似ています。runtimeexceptionsの例:IllegalStateException、NegativeArraySizeException、NullpointerException

例外を使用すると、回復のために何かを実行できるため、明示的にキャッチする必要があります。例外の例:IOException、TimeoutException、PrintException ...


4

簡単に言うと、クライアント/ユーザーが例外から回復できる場合は、チェック済み 例外にし、クライアントが例外から回復するために何もできない場合は、未チェックの RuntimeExceptionにします。たとえば、RuntimeExceptionはゼロによる除算のようなプログラム上のエラーであり、ユーザー自身はプログラマー以外は何もできず、RuntimeExceptionになります。


3

RuntimeExceptionはExceptionクラスの子クラスです

これは、Exceptionクラスの多くの子クラスの1つです。RuntimeExceptionは、Java仮想マシンの通常の操作中にスローされる可能性のある例外のスーパークラスです。メソッドのthrows句で、メソッドの実行中にスローされてもキャッチされないRuntimeExceptionのサブクラスを宣言する必要はありません。

階層は

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException


0

例外は、アプリケーションフローで予期しないイベントを処理するための良い方法です。RuntimeExceptionはコンパイラーによってチェックされませんが、例外クラスを拡張する例外を使用して、コンパイルするためにエラーをキャッチする必要があるため、APIクライアントの動作を制御することをお勧めします。また、優れたドキュメントを形成します。

クリーンなインターフェースを実現したい場合は、継承を使用して、アプリケーションが持つさまざまなタイプの例外をサブクラス化し、親例外を公開します。


0

例外には2種類あります。このような例外が発生した場合、チェックされた例外から回復できます。ランタイム例外は回復不能であり、ランタイム例外はプログラミングエラーであり、プログラマーはコードの記述中にそれを処理する必要があります。これを継続して実行すると、誤った結果が生じる可能性があります。ランタイム例外は、前提条件違反の例です。サイズ10の配列があり、11番目の要素にアクセスしようとすると、ArrayIndexOutOfBoundExceptionがスローされます


0
  1. ユーザー定義の例外は、チェックされた例外またはチェックされていない例外であり、拡張先のクラスによって異なります。

  2. ユーザー定義の例外は、例外クラスに拡張されている場合、カスタムチェック例外にすることができます。

  3. ユーザー定義の例外は、実行時例外クラスに拡張されている場合、カスタムのチェックされていない例外にすることができます。

  4. クラスを定義し、例外またはランタイム例外の子にします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.