続・とってもわかりやすいJAVA 【第26回 例外処理③】

この記事は2016年3月25日に書かれたものです。内容が古い可能性がありますのでご注意ください。


今回はいよいよ例外処理の書き方です!

例外処理

例外を処理する方法には2種類あります。

  1. try-catch
  2. 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について扱います!

  • このエントリーをはてなブックマークに追加

PAGE TOP