モジュール java.base
パッケージ java.lang

クラスThrowable

java.lang.Object
java.lang.Throwable
すべての実装されたインタフェース:
Serializable
直系の既知のサブクラス:
Error, Exception

public class Throwable extends Object implements Serializable
Throwableクラスは、Java言語のすべてのエラーと例外のスーパー・クラスです。 このクラス(またはそのサブクラスの内の1つ)のインスタンスであるオブジェクトだけがJava仮想マシンによってスローされるか、Javaのthrow構文によってスローされます。 同じように、このクラスまたはそのサブクラスの内の1つだけがcatch節の引数の型に指定できます。 例外をコンパイル時にチェックするために、 ThrowableおよびRuntimeExceptionまたはErrorのサブクラスでもないThrowableのサブクラスは、チェック例外とみなされます。

2つのサブクラスErrorExceptionのインスタンスは従来、例外的な状況が発生したことを示すために使用されます。 これらのインスタンスは、通常、関連する情報(スタック・トレース・データなど)を格納するために、例外的な状況に応じて新しく作成されます。

スロー可能オブジェクトには、作成時のそのスレッドの実行スタックのスナップショットが含まれます。 これには、エラーについての詳細情報を示すメッセージ文字列を含めることもできます。 時間の経過に従い、あるスロー可能オブジェクトがほかのスロー可能オブジェクトの伝播を抑制する可能性があります。 最後に、スロー可能オブジェクトには、原因 (このスロー可能オブジェクトが構築される原因となった別のスロー可能オブジェクト)を含めることもできます。 この原因情報の記録は例外チェーン機能と呼ばれますが、それは、原因自体に原因がある、といった具合に例外の「チェーン」(各例外がそれぞれ別の例外の原因となる)が形成されるからです。

スロー可能オブジェクトが原因を保持できる1つの理由として、スロー可能オブジェクトをスローするクラスが下位レイヤー抽象化の上に構築されていることが挙げられます。このため、上位レイヤーに対する操作が失敗するのは、下位レイヤーでの操作が失敗するためです。 下位レイヤーによりスローされるスロー可能オブジェクトを外部に送信するのは、不適切な設計方法です。これは、通常、上位レイヤーにより提供される抽象化機能とは関係がないためです。 さらに、このような操作を行うと、上位レイヤーのAPIを実装の詳細に結び付けてしまうため、下位レイヤーの例外がチェック例外と見なされてしまいます。 「ラップされた例外」(原因を含む例外)をスローすると、これらの欠点に触れずに上位レイヤーが障害の詳細を呼出し側に通信できるようになります。 このため、上位レイヤーの実装(特にメソッドによりスローされる例外のセット)をAPIを変更せずに柔軟に変更できます。

スロー可能オブジェクトが原因を保持する2番目の理由は、スロー可能オブジェクトをスローするメソッドが、原因を直接スローすることをメソッドに許可しない汎用インタフェースに準拠する必要があることです。 たとえば、永続コレクションがCollectionインタフェースに準拠し、その永続性がjava.ioの上位に実装される場合を考えましょう。 addメソッドの内部でIOExceptionがスローされる可能性があるとします。 この場合、適切な非チェック例外のIOExceptionをラップすることにより、実装はCollectionインタフェースに準拠しつつ、IOExceptionの詳細を呼出し側に通知できます。 永続コレクションの仕様に、この種の例外をスロー可能であることが示されている必要があります。

原因は、2つの方法でスロー可能オブジェクトに関連付けることができます。1つは原因を引数として取るコンストラクタを使用する方法、もう1つはinitCause(Throwable)メソッドを使用する方法です。 原因の関連付けを可能にする新規スロー可能クラスは、原因を受け取るコンストラクタを提供し、原因を受け取るいずれかのThrowableコンストラクタに(通常間接的に)委譲する必要があります。 initCauseメソッドはpublicであるため、原因を任意のスロー可能オブジェクトに関連付けることが可能です。これは、実装が例外チェーン・メカニズムのThrowableへの追加に先行する「レガシー・スロー可能オブジェクト」であっても当てはまります。

従来、Throwableクラスおよびそのサブクラスは2つのコンストラクタを保持します。1つは引数を取らず、もう1つは詳細メッセージの生成に使用可能なString引数を取ります。 また、関連付けられた原因を保持可能なこれらのサブクラスは、さらに2つのコンストラクタを保持します。1つはThrowable (原因)を取り、もう1つはString (詳細メッセージ)およびThrowable (原因)を取ります。

Java言語仕様を参照してください:
11.2コンパイル時の例外検査
導入されたバージョン:
1.0
関連項目: