Developer

【はじめてのJava】複数のcatchブロック【例外処理編】
2021.08.31
Lv1

【はじめてのJava】複数のcatchブロック【例外処理編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


例外の対応

前回の記事で、例外の種類について紹介しました。
今回は例外を処理する際に、複数の例外クラスを処理したい場合にどのような処理を行う必要があるのかを解説していきます。

目次


例外に対処する

前回の記事で、tryブロックとcatchブロックを利用して例外処理の記述をする方法を解説しました。
例外処理の記述をする時にはcatchブロックに例外クラスを指定し、指定された例外が発生したらcatchブロックに処理が引き継がれるということを解説しました。
その際に、複数の種類の例外が発生したときに複数のcatchブロックを記述することで様々な例外に対応できます。


複数のcatch文

tryブロックとcatchブロックを利用して例外処理のコードを記述する際に、catchブロックはいくつでも記述することができます。
構文

try{
	例外が起こる可能性があるコード
}catch( 例外クラス① 変数名 ){
	//例外①が起こった際の処理
}catch( 例外クラス② 変数名 ){
	//例外②が起こった際の処理
}catch( 例外クラス③ 変数名 ){
	//例外③が起こった際の処理
}

ただし、catchブロックに指定する例外クラスの順番に気を付けなければいけません。
プログラム上で、catchブロックに処理が渡されると、定義されているcatchブロックを「上から順に」発生した例外と「同じクラスかそのスーパークラス」があるかないかを判定していきます。

つまり、指定した例外クラスのサブクラスに属する例外クラスもすべてキャッチしてしまうので、上に定義したcatchブロックに範囲が広い例外クラスを指定してしまうと、それ以降に定義したcatchブロックに処理が移らなくなってしまいます。

また、複数のcatchブロックを定義した際に、指定した例外クラスに継承関係がある場合、記述する順番がサブクラスから順になっていないとコンパイルエラーになります。


multi-catch

また、1つのcatchブロックで複数の例外クラスのキャッチする「マルチキャッチ」という機能もあります。
マルチキャッチ」の記述では、catchブロックで例外クラスを指定する際に、複数の例外を「|(パイプ)」で区切って列挙し、例外クラスの最後に変数名を記述します。
構文

try{
	例外が起こる可能性があるコード
}catch( 例外クラス① | 例外クラス② 変数名 ){
	//例外が起こった際の処理
}

マルチキャッチの記述で注意しなければいけないことがいくつかあります。

  • 変数名は、例外クラスを列挙した最後に1つだけ記述しなければいけない。
  • 同じ例外クラスを複数記述することはできない。
  • 継承関係がある例外クラスは並べて記述することができない。
  • キャッチした例外クラスの変数には暗黙的にfinalがつく。

マルチキャッチを利用することで、1つのcatchブロックで複数の例外を処理できるので、複数の例外で同じ処理の内容をまとめることができるというメリットはありますが、
細かいエラーの内容を示すことができないというデメリットもあります。
catchブロックの中のプログラムを例外クラスによって変えたい場合には、catchブロックを何個も書いていくしかありません。


例外処理編・次回の内容

今回は複数のcatchブロックを利用した例外処理の方法を紹介しました。
次回は、例外を逃れる(別のクラスに任せる)方法を解説していきます。


初めてのJavaシリーズの目次はこちら
例外処理編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら