Javaのチェック例外とは

プログラミング

Java SE 8 Programmer I (1Z0-808-JPN) のサンプル問題を解いていてチェック例外について不明だったためまとめてみました。

チェック例外とは

例外には下記の2種類があります。

・チェック例外

・非チェック例外

チェック例外とは・・・

プログラムを実行するために変換(コンパイル)する際に予期される可能性のある例外です。
具体的には、ファイルの読み書きやネットワーク接続など、外部リソースにアクセスする際に発生する可能性のある例外が該当します。
これらの例外は、コンパイル時にチェックされるため、必ずtry-catch文やthrows宣言で例外処理を行う必要があります。

例外処理を行わない場合、コンパイルエラーが発生し、プログラムを実行することができません。

チェック例外の代表的なものとしては、IOException(※1)やSQLException(※2)などがあります。これらの例外は、メソッドの宣言部分にthrowsキーワードを使って明示的に宣言することができます。

(※1):Javaの標準ライブラリで提供されている例外クラスの一つで、入出力処理でエラーが発生した場合にスローされます。ファイルの読み書きやネットワーク通信など、入出力処理に関する多くのメソッドがIOExceptionをスローする可能性があります。
(※2):Javaプログラムでデータベースにアクセスする際に発生する例外の一種です。データベースへの接続に関する問題、SQLクエリの実行中にエラーが発生した場合、データベースの操作に関する様々なエラーなどが原因となって発生します。

具体的には下記のようなコードが挙げられます。
下記は、IOExceptionというチェック例外がスローされる可能性があるメソッドの例です。

import java.io.*;

public class Example {
    public static void main(String[] args) {
        try {
            FileReader file = new FileReader("example.txt");
            // ここで例外が発生する可能性がある
        } catch (IOException e) {
            System.out.println("ファイルを読み込めませんでした。");
        }
    }
}

この例では、FileReaderのコンストラクタがIOExceptionをスローする可能性があります。IOExceptionはチェック例外であるため、このメソッドを呼び出す際には、必ずtry-catch文で例外処理を行う必要があります。そうしない場合、コンパイルエラーが発生します。

非チェック例外とは・・・

非チェック例外とは、簡単に言うとプログラム実行中に起こるエラーのことです。
代表的なものに、NullPointerException(※1)やArrayIndexOutOfBoundsException(※2)などがあります。

非チェック例外は、プログラムの実行時に発生する可能性がある例外であり、予期せぬ例外が発生した場合には、プログラムが異常終了することがあります。そのため、非チェック例外は、プログラムのバグを発見するのに役立ちます。また、非チェック例外はtry-catchブロックで捕捉しなくてもコンパイルエラーにならないため、プログラマーが明示的に例外処理を書かなくてもよい場合もあります。

(※1):Javaプログラミング言語でよく発生する、実行時例外の1つです。通常、nullオブジェクトを参照しようとした場合にスローされます。例えば、nullオブジェクトを呼び出したり、nullオブジェクトのメソッドを呼び出したりした場合に、NullPointerExceptionが発生する可能性があります。
(※2):配列のインデックスが配列の境界外にある場合にスローされる例外です。配列の要素にアクセスしようとした際に、インデックスが配列の長さ以上、または負の値である場合にこの例外がスローされます。

具体的には下記のようなコードが挙げられます。
下記は、NullPointerExceptionという非チェック例外がスローされる可能性があるメソッドの例です。

public class Test {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length()); // null 参照に対してメソッド呼び出し
    }
}

この例では、nullのオブジェクトに対して対象のオブジェクトの桁数を取得するlength()メソッドを使用しているため、NullPointerExceptionがスローされる仕組みになっています。

まとめ

Javaでチェック例外・非チェック例外について忘れたら大きく分けて下記のように判断するのだということを思い出したいと思います。

・チェック例外:コンパイル時エラー
・非チェック例外:実行時エラー

コメント

タイトルとURLをコピーしました