talosのプログラミング教室

はじめてのJava ~例外処理編~

スポンサーリンク

f:id:talosta:20200330151413p:plain


今回はJava例外処理について説明します。

例外処理とはプログラムの実行中に発生した問題に対する処理のことです。

例外処理を記述することで、問題の発生よる異常終了を避けることができます。

堅牢なシステムを作るためには非常に重要な部分ですので、しっかり使い方を覚えましょう。

例外処理が必要な例

コマンドライン引数を2つ取り、それらを足し合わせた後に「aaa」と出力するプログラムを書きます。

class Calc {
    public static void main(String args[]) {
        double ans, a, b;
        a = Double.parseDouble(args[0]);
        b = Double.parseDouble(args[1]);
        ans = a + b;
        System.out.println("aaa");
    }
}

コマンドライン引数が1つしかなかった場合、以下のようなエラーメッセージが出ます。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
        at Calc.main(Calc.java:5)

本来であれば「aaa」と出力されるところが、それ以前に止まってしまっているため出力されません。

このような異常時にも、本来の出力をしたいときなどに例外処理が役立ちます。

例外処理の記述

tryブロックの中に例外が発生し得る処理を記述し、catchブロックの中に例外発生時の処理を記述します。

また、オプションでfinallyブロックに例外が発生しても発生しなくても実行したい処理を記述することができます。

class Calc {
    public static void main(String args[]) {
        double ans, a, b;

        try {
            a = Double.parseDouble(args[0]);
            b = Double.parseDouble(args[1]);
            ans = a + b;
        }
        catch(ArrayIndexOutOfBoundsException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("aaa");
        }
    }
}

このように記述すると、コマンドライン引数を1つにしても「aaa」が出力されます。

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
aaa

例外を明示的に起こす

「throw」を使うことで例外を明示的に起こすこともできます。

class ExceptionSample1 {
    public static void main(String args[]) {
        try {
            if(Double.parseDouble(args[0]) == 0) {
                throw new Exception();
            }
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

コマンドライン引数を0にすると以下のような出力になります。

java.lang.Exception

呼び出し元に例外を投げる

「throws」を使うことで呼び出し元に例外を投げることができます。

class ExceptionSample2 {
    public static void main(String args[]) {
        try {
            a();
        }
        catch(ArithmeticException e) {
            System.out.println(e);
        }
    }

    public static void a() throws ArithmeticException {
        double a1 = 1 / 0;
    }
}
// 出力
java.lang.ArithmeticException: / by zero

throwとthrowsは名前は似ていますが使い方は全く異なるので注意しましょう。

おわりに

今回はJava例外処理について説明しました。

次回はマルチスレッドについて説明します。