1. 概要

Java例外は、チェックされた例外とチェックされていない例外の2つの主要なカテゴリに分類されます。

このチュートリアルでは、それらの使用方法に関するいくつかのコードサンプルを提供します。

2. チェックされた例外

一般に、チェックされた例外は、プログラムの制御外のエラーを表します。 たとえば、 FileInputStream のコンストラクターは、入力ファイルが存在しない場合、FileNotFoundExceptionをスローします。

Javaは、コンパイル時にチェックされた例外を検証します。

したがって、 throws キーワードを使用して、チェックされた例外を宣言する必要があります。

private static void checkedExceptionWithThrows() throws FileNotFoundException {
    File file = new File("not_existing_file.txt");
    FileInputStream stream = new FileInputStream(file);
}

try-catch ブロックを使用して、チェックされた例外を処理することもできます。

private static void checkedExceptionWithTryCatch() {
    File file = new File("not_existing_file.txt");
    try {
        FileInputStream stream = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

Javaの一般的なチェック例外には、 IOException SQLException 、およびParseExceptionがあります。

Exception クラスはチェックされた例外のスーパークラスであるため、 Exception を拡張することにより、カスタムチェックされた例外を作成できます。

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

3. 未チェックの例外

プログラムがチェックされていない例外をスローした場合、プログラムロジック内のエラーが反映されます。

たとえば、数値を0で割ると、JavaはArithmeticExceptionをスローします。

private static void divideByZero() {
    int numerator = 1;
    int denominator = 0;
    int result = numerator / denominator;
}

Javaは、コンパイル時に未チェックの例外を検証しません。さらに、キーワードをスローするメソッドで未チェックの例外を宣言する必要はありません。 上記のコードではコンパイル時にエラーは発生しませんが、実行時にArithmeticExceptionがスローされます。

Javaのいくつかの一般的な未チェックの例外は、 NullPointerException ArrayIndexOutOfBoundsException 、およびIllegalArgumentExceptionです。

RuntimeException クラスは、すべてのチェックされていない例外のスーパークラスであるため、 RuntimeException を拡張することにより、カスタムのチェックされていない例外を作成できます。

public class NullOrEmptyException extends RuntimeException {
    public NullOrEmptyException(String errorMessage) {
        super(errorMessage);
    }
}

4. チェックされた例外とチェックされていない例外を使用する場合

Javaで例外を使用して、エラー処理コードを通常のコードから分離できるようにすることをお勧めします。 ただし、スローする例外のタイプを決定する必要があります。 Oracle Java Documentation は、チェックされた例外とチェックされていない例外をいつ使用するかについてのガイダンスを提供します。

「クライアントが例外から回復することが合理的に期待できる場合は、それをチェック済みの例外にします。 クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。」

たとえば、ファイルを開く前に、最初に入力ファイル名を検証できます。 ユーザー入力ファイル名が無効な場合、カスタムチェック例外をスローできます。

if (!isCorrectFileName(fileName)) {
    throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}

このようにして、別のユーザー入力ファイル名を受け入れることでシステムを回復できます。

ただし、入力ファイル名がnullポインターであるか、空の文字列である場合は、コードにエラーがあることを意味します。 この場合、チェックされていない例外をスローする必要があります。

if (fileName == null || fileName.isEmpty())  {
    throw new NullOrEmptyException("The filename is null or empty.");
}

5. 結論

この記事では、チェックされた例外とチェックされていない例外の違いについて説明しました。 また、チェックされた例外またはチェックされていない例外をいつ使用するかを示すコード例もいくつか提供しました。

いつものように、この記事のすべてのコードはGitHubにあります。