Java複数例外処理のマスター:単一catchブロックで複数例外を捕捉
Java複数例外処理のマスター
単一catchブロックで複数例外を捕捉し、コードを合理化、よくある落とし穴を回避する方法を習得。
Java 7以前、開発者は例外タイプごとに別個のcatchブロックを書く必要があり、処理ロジックが同一でも重複コードが生じていました。
以下のシナリオを考えてみましょう。
例1:別々のcatchブロック
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException e) { System.out.println(e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
出力
/ by zero
この例では2つの異なる問題が発生し得ます:
ArithmeticException– ゼロ除算。ArrayIndexOutOfBoundsException– 10要素配列のインデックス10アクセス。
両catchブロックが同一アクションを実行し、コード重複を招いています。
単一ブロックでの複数例外捕捉
Java SE 7以降、パイプ(|)区切りで複数例外タイプを1つのcatchブロックに結合可能です。
構文:
try { // code } catch (ExceptionType1 | ExceptionType2 ex) { // handler }
例2:マルチcatchブロック
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
出力
/ by zero
ハンドラを統合することで、コードがクリーンになり、バイトコードが小さくなり、保守が容易になります。
注意:マルチcatchではパラメータが暗黙的にfinalになるため、再代入不可。
基底例外クラスの使用
捕捉対象の複数例外が共通の祖先を持つ場合、各サブクラスを列挙する代わりにその祖先を捕捉できます。
例3:基底Exceptionクラスの捕捉
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception e) { System.out.println(e.getMessage()); } } }
出力
/ by zero
Javaのすべての具象例外はExceptionを継承するため、この単一catchブロックで上記すべてのシナリオを処理できます。
基底例外が既に捕捉されている場合、同じcatchにサブクラスを含めるとコンパイルエラーになります。
例4:基底と子例外の無効な組み合わせ
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
出力
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
このエラーは、ArithmeticExceptionとArrayIndexOutOfBoundsExceptionがExceptionのサブクラスであるため、言語ルールに違反するため発生します。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Java例外ハンドリング実践:try-catch-finallyとリソース管理
- Java throw vs throws:実践例でマスターする例外ハンドリング
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上