👋

【Java】主な例外クラスについて

2024/01/15に公開

全体図

主な例外クラスと、その継承関係について図にしました。
※赤い部分は 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 例外オブジェクト;

おまけ

thorowsthrow の覚え方。

throws の「s」は「三単現のs」なので、
throws の前にはメソッド名の記述がある。
意味としては「このメソッドは <throws以下の例外>を発生させるかも」という感じ。

throw は「強制的に例外を発生させよ」という命令なので、文頭で原型で記述する。

オーバーライド時の注意

throwsキーワードが使用されているメソッドをオーバーライドするときの注意点

・サブクラスのメソッドがスローする例外は、
 スーパークラスのメソッドがスローする例外と同じクラスが、そのサブクラス型

・RuntimeExceptionおよび、RunrimeExceptionのサブクラスは、
 スーパークラスのメソッドに関係なくスローできる

・スーパークラスのメソッドにthrowsがあっても、
 サブクラス側でthrowsを記述しなくても良い

わかりやすいYouTube解説動画

https://youtu.be/SxgeqCK3lB4

Discussion