【Java】主な例外クラスについて
全体図
主な例外クラスと、その継承関係について図にしました。
※赤い部分は checked例外です。
checked例外 と unchecked例外
Javaの例外クラスには、checked例外
と unchecked例外
があります。
checked例外
Java実行環境以外の環境が原因で発生する例外。
例外処理が必須である。
例:IOException, FileNotFoundException, ClassMptFoundException
unchecked例外
プログラムが原因で発生する例外や、メモリ不足などの理由で起きる例外。
例外処理は任意である。
例:Errorのサブクラス、RuntimeExceptionのサブクラス
独自例外クラスについて
プログラマが独自に例外クラスを定義することも可能。
[アクセス修飾子] class 独自例外クラス名 extends Exception {}
Exceptionクラスを継承しているので、便利なメソッドを利用可能。
例:void printStackTrace(), String get Message()
try-catch-finally ブロック
void method(){
try{
例外が発生しそうな処理
} catch (例外クラス名 変数名) {
例外が発生した場合の処理
} finally {
必ず実行したい処理
}
}
catchブロックを複数記述する
tryブロック内で複数の例外クラスが発生する可能性がある場合、
catchブロックは複数定義することが可能。
... } catch (例外クラス名 変数名 ){
... } catch (例外クラス名 変数名 ){
...}
catchブロックを複数記述するときのルール
・例外クラス同士に継承関係がある場合、サブクラスから記述。
・例外クラス同士に継承関係がない場合、マルチキャッチで記述可能。
... } catch (例外クラス名 変数名 | 例外クラス名 変数名 ){
...}
throws
例外が発生する可能性のあるメソッドを定義するときに、throws
を利用する。
これによって、throws
で指定された例外クラスのオブジェクトが発生したとき、
その例外クラスのオブジェクトは、メソッドの呼び出し元に転送される。
→ メソッド定義側で try-catch-finally
を書かなくてもOK
(メソッド呼び出し側で記述が必要)
※unchecked例外の場合、throws
を指定しなくても、
例外が発生したとき、メソッドの呼び出し元に転送される。
[アクセス修飾子] 戻り値の型 例外の起きそうなメソッド (引数リスト) throws 例外クラス名 {}
throw
通常、Java実行環境が例外をスローするが、
throw
を記述することで、明示的に例外をスローすることも可能。
→ 強制的に例外を発生させることができる
例えば、独自の例外クラスをインスタンス化した例外オブジェクトを、
任意の場所でスローすることが可能。
throw 例外オブジェクト;
おまけ
thorows
と throw
の覚え方。
throws
の「s」は「三単現のs」なので、
throws
の前にはメソッド名の記述がある。
意味としては「このメソッドは <throws以下の例外>を発生させるかも」という感じ。
throw
は「強制的に例外を発生させよ」という命令なので、文頭で原型で記述する。
オーバーライド時の注意
throws
キーワードが使用されているメソッドをオーバーライドするときの注意点
・サブクラスのメソッドがスローする例外は、
スーパークラスのメソッドがスローする例外と同じクラスが、そのサブクラス型
・RuntimeExceptionおよび、RunrimeExceptionのサブクラスは、
スーパークラスのメソッドに関係なくスローできる
・スーパークラスのメソッドにthrowsがあっても、
サブクラス側でthrowsを記述しなくても良い
わかりやすいYouTube解説動画
Discussion