脱!プログラミング入門

このブログではプログラミング入門後にさらに能力を伸ばすための援助ができるようにしたいです

Javaの例外処理をちょっと使ってみる

 Javaなどの高級言語では例外処理という機能を使うことができます.例外処理とはプログラムで何らかの障害や不正などの例外が発生したことをプログラマやユーザに知らせ,例外に対して任意の処理をする機能です.入門書ではゼロ除算の例外処理を見たことがあるかもしれません.しかし,入門書に載っている例だけではこれから例外処理をどう扱っていけばいいかわからないと思います.今回はどんな時に例外処理を使うと効果的かを書いていきたいと思います.

Javaでの例外処理

 Javaでの例外処理は次のようになります.

try {
    // 例外が発生する可能性がある処理
} catch (〇〇Exception e) {
    // 例外後の処理
}

tryの内部で例外が発生するとcatchに記述された処理が実行されます.よく用いられるのはe.printStackTrace()です.どの部分で例外が発生したのかを示すスタックトレースが出力されます.

 入門したてでは例外処理の使いどころがわかりませんが,用いるライブラリによっては強制的に例外処理を記述する必要がある場合があります.その中の1つとしてあげられるのは入出力のライブラリです.ファイルの読み込みなどの処理を書く際に例外処理を書かなかった場合,「例外IOExceptionは報告されません。スローするには、捕捉または宣言する必要があります」というメッセージが出てコンパイルエラーが発生します.  ファイル入出力を書く際には次のように例外処理を書く必要があります.

import java.io.*;

public class FileTrial {
    public static void main(String args[]) {
        try {
            FileReader fr = new FileReader("../index.html");
            FileWriter fw = new FileWriter("copy.html");

            int i;
            while ((i = fr.read()) != -1) {
                fw.write((char) i);
            }

            fr.close();
            fw.close();
        } catch (IOException e) {
            System.out.println("Exception: " + e);
        }
    }
}

例外処理を書く色々な場面

 それでは,どのような場面で例外処理を書くのかをいくつかあげていきたいと思います.あらゆるライブラリを使う時にどのような例外が発生するかは,そのライブラリのリファレンスマニュアルに載っている「〇〇Exception」を見ればわかります.そして,その例外が発生しそうな処理を書く場合にtry catch文のcatchの所で適した「〇〇Exception」を使うようにすれば,例外が発生した際に例外処理を実行できるようになります.

 先ほど例に挙げた入出力のライブラリである「java.io」を使う際にはIOExceptionを使います.「java.util」にあるStackクラスを使う際にはEmptyStackExceptionを使います.

 各ライブラリ固有の例外ではなくてもJavaでは標準パッケージに含まれる例外を使うことができます.配列を使う際に範囲外の領域を読み込もうとする例外が発生した際にはArrayIndexOutOfBoundsExceptionを使います.この例外に対する例外処理の例を以下に示します.

public class ArrayBounds {
    public static void main(String[] args) {
        try {
            int nums[] = new int[3];
            nums[4] = 9;
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }
}

配列numsの範囲外の領域であるnums[4]に9を代入しようとしています.このプログラムをコンパイルするとエラーは出ませんが,実行するとe.printStackTrace()が実行されて,以下のように実行結果が出力されてどこで例外が発生しているかわかります.

java.lang.ArrayIndexOutOfBoundsException: 4
    at ArrayBounds.main(ArrayBounds.java:5)

終わりに

 例外処理は作るアプリケーションの規模が大きくなるほど気をつけてこまめに書く必要があります.入門してすぐでは小規模なアプリケーションしか作れず,どのような部分で例外処理を書くべきか分からずに例外処理を書かないというケースが結構あるのではないかと思います.何らかのライブラリを使う時はどのような例外が発生するかを調べて,入門してすぐの状態でも例外処理を書く癖をつければ,作るアプリケーションの規模が大きくなった時に対応しやすくなると思います.

 とはいえ,やはりはじめのうちは例外処理を書く癖がついていないので書き忘れると思います.書く癖がついていないうちはとことん例外処理を書かずにアプリケーションを作り(仕事など以外で責任が問われない場合に限ります),例外処理がどういったところで必要になるのかを身をもって体験するのもアリだと思います.