例外は、処理内で予期せぬ動きが起きた時
(または明示的)に生成されるオブジェクトです。
例外の型(クラス)は複数あります。
全ての親となる「基底クラス」がExceptionクラスです。
エラーと例外は別物です。
(Throwableインターフェースをどちらも実装していますが、クラスとしては継承関係にありません。)
基本の構文
例外が発生する可能性がある処理をtryブロックで括り、
発生した例外をcatchブロックで捕捉(catch)する。
この時、catchの引数に指定している「例外の型」と同じか
サブクラスの例外でなければ、
catchは捕捉しません。
1 2 3 4 5 | try { 通常処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } |
throw
例外の発生を自分が処理内で明示的に行いたい場合は、
「throw」メソッドを用います。
引数に例外オブジェクトを渡すことで、
例外を「catch」ブロックへ投げる(throw)することができます。
1 2 3 4 5 6 | try { 通常処理 throw ( new 例外の型(コンストラクタ引数)); } catch (例外の型 例外オブジェクト変数){ 例外処理 } |
複数のcatch
例外の型によって例外処理を分ける場合、
「catch」ブロックを複数つなげることができます。
1つ目のcatchの例外の型が、
2つ目のcatchの例外の型の親クラスか同じクラスの場合、
2つ目のcatchブロックは通りません。
従って、catchブロックを複数つなげる場合に
例外の型に継承関係がある場合は、
子クラスの方から定義します。
1 2 3 4 5 6 7 | try { 通常処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } |
finally
例外が発生した場合、
tryブロックの例外発生以降の処理は実行されません。
例外が発生した場合もしなかった時も
必ず実行しておきたい処理が有る場合は、
finallyブロックに記述します。
1 2 3 4 5 6 7 8 9 | try { 通常処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } finally { 必ず実行したい処理 } |
try-catchのネスト
try-catchは内部でネスト可能です。
1 2 3 4 5 6 7 8 9 | try { try { 通常処理 } catch (例外の型 例外オブジェクト変数){ 例外処理 } } catch (例外の型 例外オブジェクト変数){ 例外処理 } |