回答:
一般に、RuntimeExceptionsは、プログラムで防止できる例外です。例えば NullPointerException
、ArrayIndexOutOfBoundException
。null
メソッドを呼び出す前に確認すると、NullPointerException
発生しません。ArrayIndexOutOfBoundException
最初にインデックスをチェックした場合も同様です。RuntimeException
コンパイラーによってチェックされないため、クリーンなコードです。
編集:最近の人々はRuntimeException
それが生成するクリーンなコードのために好んでいます。それは完全に個人的な選択です。
RuntimeException
は、それが単純であり、チェックされた例外とチェックされていない例外の違いを考える必要がなくなるためだと思います。のような回復不可能な例外をキャッチするため、ランタイム例外をキャッチすることはひどい考えだと思いますNullPointerException
。
Javaには、チェック例外とチェックなし例外の2種類の例外があります。チェックされた例外はコードで明示的に処理する必要がありますが、チェックされていない例外は明示的に処理する必要はありません。
チェック例外の場合、例外をスローする可能性のあるコードの周りにtry / catchブロックを配置するか、メソッドに「throws」句を追加して、メソッドがこのタイプの例外をスローする可能性があることを示す必要があります(呼び出しクラス以上で処理されます)。
「Exception」から派生する例外はすべてチェック済み例外ですが、RuntimeExceptionから派生するクラスはチェックされません。RuntimeExceptionsは、呼び出し元のコードで明示的に処理する必要はありません。
java.lang.RuntimeException
とjava.lang.Exception
クラスの違いを見る前に、Exception
階層を知っておく必要があります。Exception
とError
クラスはどちらも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
ランタイム例外クラス(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ブロックで囲むことができます)。
クライアントが例外からの回復が合理的に期待できる場合は、チェック済み例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。
チェックされていない例外はから派生したものでRuntimeException
あり、チェックされた例外はから派生したものであることに注意してくださいException
。
RuntimeException
クライアントが例外から回復するために何もできない場合、なぜスローするのですか?記事の説明:
ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、例外から回復したり、何らかの方法で処理したりすることは合理的に期待できません。このような問題には、ゼロによる除算などの算術例外が含まれます。null参照を介してオブジェクトにアクセスしようとするなどのポインタ例外。インデックス付けの例外。たとえば、大きすぎるまたは小さすぎるインデックスを使用して配列要素にアクセスしようとした場合。
オラクルのドキュメントから:
要点のガイドラインは次のとおりです。クライアントが例外からの回復が合理的に期待できる場合は、チェックされた例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。
ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、例外から回復したり、何らかの方法で処理したりすることは合理的に期待できません。
RuntimeExceptionsは、 "apiの無効な使用による例外"に似ています。runtimeexceptionsの例:IllegalStateException、NegativeArraySizeException、NullpointerException
例外を使用すると、回復のために何かを実行できるため、明示的にキャッチする必要があります。例外の例:IOException、TimeoutException、PrintException ...
RuntimeExceptionはExceptionクラスの子クラスです
これは、Exceptionクラスの多くの子クラスの1つです。RuntimeExceptionは、Java仮想マシンの通常の操作中にスローされる可能性のある例外のスーパークラスです。メソッドのthrows句で、メソッドの実行中にスローされてもキャッチされないRuntimeExceptionのサブクラスを宣言する必要はありません。
階層は
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException