こんにちは。「Javaを復習する初心者」です。
今回はthrow文について復習しました。
throw文を使うと例外をスローすることができます。throw [例外のインスタンス]という書き方です。
例外には2種類あります。
- チェック例外
- ExceptionクラスとそのサブクラスのうちでRuntimeExceptionのサブクラスでないもの
- 非チェック例外
- RuntimeExceptionクラスとそのサブクラス
チェック例外をthrow
チェック例外をthrow文に記述した場合、その位置によっては更に追加するものがあります。例えば、以下の例はメソッドのブロック直下にthrow文を書いたものです。この例はエラーになります。
エラーあり
private static void test() {
throw new Exception();
}
この状態ではコンパイルエラーが発生します。Eclipseではthrow文の行に赤い波線が出力されます。「処理されない例外の型 Exception」というエラー内容です。チェック例外をthrow文に書いた場合、その位置によってはエラーが出ます。この例では例外処理が全くないためにエラーが出ました。
コンパイルエラーを解消するためには次の2つの方法があります。
- メソッドにスロー宣言を追加する。
- try-catch文を追加する。
「メソッドにスロー宣言を追加する。」という方法はメソッドの宣言の箇所に「throws Exception」という文言を追加することです。この文言を追加した場合、呼び出し元で例外処理が必要になります。なので、呼び出し元に例外処理がない場合は呼び出し元でコンパイルエラーになります。
「try-catch文を追加する。」という方法はthrow文をtry-catch文で囲んで例外処理をする方法です。例えば以下のように書きます。
例外処理
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
例外発生時はcatch節が処理されます。上記ではコンソールにスタックトレースを出力しています。catch節に何も書かなくてもエラーにはなりませんが、例外が起きたのかどうか、実効結果では判断できなくなります。
非チェック例外をthrow
次の例では非チェック例外をthrowしています。コンパイルエラーになりません。
エラーなし
private static void test() {
throw new RuntimeException();
}
この場合、メソッドにthrows節を追加する必要はありませんが、追加してもエラーにはなりません。また、非チェック例外のthrows宣言が記述しているメソッドを呼び出してもtry-catch節は必須ではありません。