Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

検査例外と非検査例外の違いと実装例

検査例外と非検査例外

「検査例外」と「非検査例外」は、ソフトウェア開発やプログラミングの文脈で使用される用語です。
これらはエラー処理に関連しており、プログラムが実行中に発生する可能性のある異常な状況に対処するための手段として使用されます。

1. 検査例外(Checked Exception):

  • 検査例外は、プログラムが実行中に発生する可能性のある例外がコンパイル時に検査される例外です。
  • 関数やメソッドが検査例外をスローする可能性がある場合、そのメソッドを呼び出す側はそれに対処する必要があります。

通常、try-catchブロックを使用して例外を捕捉し、適切な処理を行います。

  • 典型的な例は、ファイルの入出力時に発生するIOExceptionなどがあります。
try {
    // 何らかの検査例外が発生する可能性のあるコード
    // 例: ファイルの読み込みや書き込み
} catch (IOException e) {
    // 検査例外が発生した場合の処理
    e.printStackTrace();
}

2. 非検査例外(Unchecked Exception):

  • 非検査例外は、実行時に発生する例外であり、コンパイラがこれらの例外を検査しないため、try-catchブロックで捕捉する必要はありません。
  • プログラムのバグや実行時のエラーが原因で発生することがあり、通常は防ぐことが難しいものです。
  • 典型的な例は、NullPointerExceptionやArrayIndexOutOfBoundsExceptionなどがあります。
// 非検査例外が発生する可能性のあるコード
// 例: 配列の範囲外アクセス
int[] array = {1, 2, 3};
int value = array[5]; // ArrayIndexOutOfBoundsExceptionが発生する可能性がある

検査例外と非検査例外の区別は、Javaのような静的型付け言語でよく見られますが、他の言語でも同様の概念が存在することがあります。

検査例外を処理する実装例

検査例外を処理するためには、通常、try-catchブロックを使用して例外をキャッチし、適切な処理を行います。
以下は、Javaでの検査例外を処理する実装の例です。
例として、ファイルの読み込み処理を考えてみましょう。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileProcessor {

    public static void main(String[] args) {
        // ファイルのパスを指定
        String filePath = "sample.txt";

        try {
            // ファイルを読み込むためのBufferedReaderを作成
            BufferedReader reader = new BufferedReader(new FileReader(filePath));

            // ファイルの内容を1行ずつ読み込む
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // ファイルのクローズ
            reader.close();

        } catch (IOException e) {
            // 検査例外が発生した場合の処理
            System.err.println("ファイルの読み込みエラー: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 例外が発生しても発生しなくても実行される部分
            System.out.println("処理終了");
        }
    }
}

この例では、FileReaderやBufferedReaderを使用してファイルを読み込む処理を行っています。
tryブロック内で検査例外が発生する可能性のあるコードがあり、catchブロックでそれを捕捉して処理しています。
また、finallyブロックでは、例外が発生しても発生しなくても必ず実行される処理を書くことができます。
ファイルのクローズなど、リソースの解放が必要な処理は通常ここに書かれます。

このようにして、検査例外が発生した場合に適切に処理を行うことができます。

非検査例外を処理する実装例

非検査例外(Unchecked Exception)は通常、プログラムのバグや実行時エラーから発生するものであり、コンパイラが検査しないため、try-catchブロックで捕捉する必要はありません。
ただし、このような例外が発生した場合に備えて、適切なエラーハンドリングやログ記録が重要です。
以下は、非検査例外に対する基本的なエラーハンドリングとログ記録の例です。

public class UncheckedExceptionHandling {

    public static void main(String[] args) {
        try {
            // バグや実行時エラーが原因で発生する非検査例外の例
            int result = divide(10, 0);
            System.out.println("Result: " + result);

        } catch (ArithmeticException e) {
            // 非検査例外が発生した場合の処理
            System.err.println("除算エラー: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 例外が発生しても発生しなくても実行される部分
            System.out.println("処理終了");
        }
    }

    public static int divide(int dividend, int divisor) {
        // 0で割ることができないため、ArithmeticExceptionが発生する可能性がある
        return dividend / divisor;
    }
}

この例では、divideメソッド内で0で割り算を行っているため、実行時にArithmeticExceptionが発生します。
mainメソッドでは、この非検査例外を捕捉してエラーメッセージを表示し、printStackTraceメソッドでスタックトレースを出力しています。
これにより、エラーが発生した際にデバッグやトラブルシューティングに役立つ情報を取得できます。

注意点として、通常は非検査例外を捕捉して具体的な対応を行うよりも、プログラムの品質を向上させ、バグを事前に検知することが望ましいです。
しかし、適切なエラーハンドリングやログ出力を備えることは、実際の運用でのトラブルシューティングに役立ちます。