Javaでカスタム例外を作成する

Javaでカスタム例外を作成する

1. 前書き

このチュートリアルでは、how to create a custom exception in Javaについて説明します。

ユーザー定義の例外がどのように実装され、チェック例外と未チェック例外の両方に使用されるかを示します。

2. カスタム例外の必要性

Java例外は、プログラミングで発生する可能性のあるほぼすべての一般的な例外をカバーします。

ただし、これらの標準的な例外を独自に補足する必要がある場合があります。

カスタム例外を導入する主な理由は次のとおりです。

  • ビジネスロジックの例外–ビジネスロジックとワークフローに固有の例外。 これらは、アプリケーションのユーザーまたは開発者が正確な問題が何であるかを理解するのに役立ちます

  • 既存のJava例外のサブセットに特定の処理をキャッチして提供するには

Java例外はチェックおよびチェック解除できます。 次のセクションでは、これらの両方のケースについて説明します。

3. カスタムチェック例外

チェック例外は、明示的に処理する必要がある例外です。

ファイルの最初の行を返すコードを考えてみましょう:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
    // Logging, etc
}

上記のコードは、Javaチェック例外を処理する古典的な方法です。 コードはFileNotFoundException,をスローしますが、正確な原因が何であるか(ファイルが存在しないか、ファイル名が無効であるか)は明確ではありません。

カスタム例外を作成するには、java.lang.Exceptionクラスを拡張する必要があります。

IncorrectFileNameException:というカスタムチェック例外を作成して、この例を見てみましょう。

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

エラーメッセージとしてStringを受け取り、親クラスコンストラクターと呼ばれるコンストラクターも提供する必要があることに注意してください。

カスタム例外を定義するために必要なのはこれだけです。

次に、この例でカスタム例外を使用する方法を見てみましょう。

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine())
        return file.nextLine();
} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException("Incorrect filename : " + fileName );
    }
    //...
}

カスタム例外を作成して使用したため、ユーザーは正確な例外が何であるかを知ることができます。 これで十分ですか? したがって、私たちはlosing the root cause of the exceptionです。

これを修正するために、コンストラクタにjava.lang.Throwableパラメータを追加することもできます。 このようにして、ルート例外をメソッド呼び出しに渡すことができます。

public IncorrectFileNameException(String errorMessage, Throwable err) {
    super(errorMessage, err);
}

現在、IncorrectFileNameExceptionは、次のような例外の根本原因とともに使用されます。

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }
    // ...
}

これが、カスタム例外without losing the root cause from which they occurredを使用する方法です。

4. カスタム未チェック例外

同じ例で、ファイル名に拡張子が含まれていない場合、カスタム例外が必要であると想定します。

この場合、このエラーは実行時にのみ検出されるため、前の例外と同様のカスタムの未チェックの例外が必要になります。

To create a custom unchecked exception we need to extend the java.lang.RuntimeException class

public class IncorrectFileExtensionException
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}

したがって、この例では、このカスタムのチェックされていない例外を使用できます。

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    } else {
        throw new IllegalArgumentException("Non readable file");
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }

    //...
} catch(IllegalArgumentException err) {
    if(!containsExtension(fileName)) {
        throw new IncorrectFileExtensionException(
          "Filename does not contain extension : " + fileName, err);
    }

    //...
}

5. 結論

カスタム例外は、ビジネスロジックに関連する特定の例外を処理する必要がある場合に非常に役立ちます。 適切に使用すると、例外処理とロギングを改善するための便利なツールとして機能します。

この記事で使用されている例のコードは、over on Githubで入手できます。