今回はいよいよ例外処理の書き方です!
■例外処理
例外を処理する方法には2種類あります。
- try-catch
- throws
この2種類です。
例外を「捕らえる」か「逃れる」か、とも言えるでしょう。
今回は「try-catch」について説明していきます!
■try-catch
try-catchは発生した例外を捕らえて処理をします。
構文は以下の通りとなります。
try { // 例外が発生する可能性のある文; } catch(例外クラス 変数名) { // 例外が発生したときに行う処理 }
tryブロックの中で例外が発生するとcatchブロックに処理が移ります。
ただし、捕らえられる例外はcatchブロックで指定したクラスに限ります。
ではサンプルで確かめてみましょう!
■SampleTryCatch_01.java
public class SampleTryCatch_01 { public static void main(String[] args) { try { int i = 10 / 0; // 例外発生 System.out.println(i); // 実行されない } catch(ArithmeticException ae) { System.out.println("例外が発生しました"); } } }
■実行結果
例外が発生しました
■解説
4行目で例外が発生します。
0で割ろうとすると「ArithmeticException」が発生します。
この時点でcatchブロックに移行し、例外がキャッチできるか判定されます。
今回は6行目で「ArithmeticException」を指定していますので、キャッチすることができます。
キャッチできるとブロックの処理が実行されます。
すると「例外が発生しました」と出力されるわけです。
ではcatchできない場合も確認してみましょう!
■SampleTryCatch_02.java
public class SampleTryCatch_02 { public static void main(String[] args) { try { int i = 10 / 0; // 例外発生 System.out.println(i); // 実行されない } catch(NullPointerException ne) { System.out.println("例外が発生しました"); } catch(ArrayIndexOutOfBoundsException ae) { System.out.println("例外が発生しました"); } } }
■実行結果
Exception in thread “main” java.lang.ArithmeticException: / by zero
at jp.co.ssie.SampleTryCatch.main(SampleTryCatch.java:6)
■解説
6行目でキャッチできるクラスを「NullPointerException」、8行目では「ArrayIndexOutOfBoundsException」を指定しています。
実際に投げられるのはArithmeticExceptionなのでキャッチすることができないのです。
ちなみに6~10行目のようにcatchブロックを複数書くことも可能です。
ではもう1つだけサンプルをみてみましょう。
■SampleTryCatch_03.java
public class SampleTryCatch_03 { public static void main(String[] args) { try { int i = 10 / 0; // 例外発生 System.out.println(i); // 実行されない } catch(Exception e) { System.out.println("例外が発生しました"); } } }
■実行結果
例外が発生しました
■解説
実はスーパークラスでもキャッチすることができます。
「ArithmeticException」は「RuntimeException」を継承していて、
「RuntimeException」は「Exception」を継承しています。
例外ごとに処理を分岐しないのであれば、Exceptionを指定しておけば楽ですね。
■まとめ
- 例外処理は「try-catch」と「throws」の2種類
- 「try-catch」は発生した例外によって処理を書くことができる。
- catchブロックは複数書ける
- スーパークラスでもキャッチできる
次回はthrowsについて扱います!