Javaのチェック済みおよび未チェックの例外

1. 概要

link:/java-exceptions[Java例外]は、*チェック済み例外と未チェック例外*の2つの主なカテゴリに分類されます。 この記事では、それらの使用方法に関するコードサンプルを提供します。

2. チェック済みの例外

一般に、チェック例外は、プログラムの制御外のエラーを表します。 たとえば、https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html#FileInputStream-java.io.File- [_FileInputStream_] throws _FileNotFoundException_ if入力ファイルが存在しない。
  • Javaはコンパイル時にチェック例外を検証します。*

    したがって、https://www.baeldung.com/java-throw-throws [_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のlink:/java-common-exceptions [よくチェックされる例外]には、_IOException _、_ SQLException_、および_ParseException_があります。
https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html[_Exception_]クラスは、チェック済み例外のスーパークラスです。 したがって、_Exception_を拡張することにより、https://www.baeldung.com/java-new-custom-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はコンパイル時に未チェックの例外を検証しません。*さらに、 throws keywordを使用してメソッドで未チェックの例外を宣言する必要はありません。 また、上記のコードにはコンパイル時にエラーはありませんが、実行時に_ArithmeticException_がスローされます。

    Javaのlink:/java-common-exceptions [一般的な未チェックの例外]は、_NullPointerException _、_ ArrayIndexOutOfBoundsException_、および_IllegalArgumentException_です。
    _https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html [RuntimeException] _クラスは、すべての未チェックの例外のスーパークラスです。 したがって、_RuntimeException_を拡張することにより、https://www.baeldung.com/java-new-custom-exception [未チェックのカスタム例外を作成]を実行できます。
public class NullOrEmptyException extends RuntimeException {
    public NullOrEmptyException(String errorMessage) {
        super(errorMessage);
    }
}

4. チェック済み例外と未チェック例外を使用する場合

Javaで例外を使用して、エラー処理コードを通常のコードから分離できるようにすることをお勧めします。 ただし、スローする例外のタイプを決定する必要があります。 https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html[Oracle Java Documentation]は、チェック例外と未チェック例外をいつ使用するかについてのガイダンスを提供します。
_「クライアントが例外から回復することが合理的に期待できる場合は、クライアントをチェック済み例外にします。 クライアントが例外から回復するために何もできない場合は、未チェックの例外にします。」_
たとえば、ファイルを開く前に、まず入力ファイル名を検証できます。 ユーザー入力ファイル名が無効な場合、カスタムチェック例外をスローできます。
if (!isCorrectFileName(fileName)) {
    throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}
このようにして、別のユーザー入力ファイル名を受け入れることでシステムを回復できます。 ただし、入力ファイル名がヌルポインターまたは空の文字列である場合、コードにエラーがあることを意味します。 この場合、未チェックの例外をスローする必要があります。
if (fileName == null || fileName.isEmpty())  {
    throw new NullOrEmptyException("The filename is null or empty.");
}

5. 結論

この記事では、チェック例外と未チェック例外の違いについて説明しました。 また、チェック済みまたは未チェックの例外をいつ使用するかを示すコード例をいくつか提供しました。
いつものように、この記事にあるすべてのコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-exceptions[GitHubで]にあります。