Menu
Coddy logo textTech

復習 - ユーザーのバリデーション

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/87。

challenge icon

チャレンジ

簡単

入力データを検証し、カスタム例外を使用して何が問題だったかを正確に伝える、完全なユーザー登録システムを構築しましょう!この章で学んだすべてを組み合わせます。カスタムのチェック例外(検査例外)と非チェック例外(非検査例外)、例外の階層構造、そして AutoCloseable なバリデータを用いた try-with-resources です。

コードは5つのファイルに分けて構成します:

  • ValidationException.java: すべてのバリデーションエラーのベースとなるチェック例外を作成します。この例外は Exception を継承し、メッセージを受け取るコンストラクタを含める必要があります。
  • InvalidUsernameException.java: ユーザー名のバリデーション失敗のためのチェック例外を作成します。これは ValidationException クラスを継承し、小さな例外階層を作成します。メッセージを受け取り、それを親クラスに渡すコンストラクタを含めてください。
  • InvalidAgeException.java: 年齢関連のエラー(プログラミングエラーを表す負の年齢など)のための非チェック例外を作成します。これは RuntimeException を継承し、メッセージを受け取るコンストラクタを含める必要があります。
  • UserValidator.java: 適切にクローズされるべきバリデーションセッションをシミュレートするために、AutoCloseable を実装するクラスを作成します。バリデータは以下の動作をする必要があります:

    コンストラクタで "Validator session started" と出力します。

    validateUsername(String username) メソッドを持ち、ユーザー名が null、空、または3文字未満の場合に InvalidUsernameException をスローします(メッセージは "Username must be at least 3 characters")。それ以外の場合は、"Username '[username]' is valid" と出力します。

    validateAge(int age) メソッドを持ち、年齢が負の場合に InvalidAgeException をスローします(メッセージは "Age cannot be negative: [age]")。年齢が13歳未満の場合は、メッセージ "Must be at least 13 years old" とともに ValidationException をスローします。それ以外の場合は、"Age [age] is valid" と出力します。

    close() を実装し、"Validator session closed" と出力します。

  • Main.java: バリデーションシステムをまとめます!ユーザー名(String)と年齢(integer)の2つの入力を受け取ります。

    try-with-resources を使用して UserValidator を作成します。try ブロック内で、まずユーザー名を検証し、次に年齢を検証します。両方に合格した場合は、"User registration successful!" と出力します。

    InvalidUsernameException をキャッチして "Username error: [message]" と出力します。InvalidAgeException をキャッチして "Age error: [message]" と出力します。親クラスである ValidationException をキャッチして "Validation error: [message]" と出力します。

    バリデーションが成功したか失敗したかにかかわらず、バリデータは自動的にクローズされる必要があります!

入力は、ユーザー名(String)、年齢(integer)の順に2つ与えられます。

このチャレンジは章全体を総括するものです。ValidationException を親とする例外階層を構築し、チェック例外と非チェック例外の両方を適切に使用し、try-with-resources でバリデータのリソースが常にクリーンアップされるようにします。子の InvalidUsernameException の後に親の ValidationException をキャッチすることで、他のバリデーションエラーもキャッチしつつ、特定のケースを先に処理できることに注目してください!

自分で試してみよう

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 入力を読み込む
        String username = scanner.nextLine();
        int age = scanner.nextInt();
        
        // TODO: try-with-resources を使用して UserValidator を作成する
        // try ブロック内:
        //   1. username を検証する
        //   2. age を検証する
        //   3. 両方の検証に合格した場合は、"User registration successful!" と出力する
        
        // TODO: InvalidUsernameException をキャッチし、"Username error: [message]" と出力する
        
        // TODO: InvalidAgeException をキャッチし、"Age error: [message]" と出力する
        
        // TODO: ValidationException (親クラス) をキャッチし、"Validation error: [message]" と出力する
        
        // Note: バリデータは、成功か失敗かにかかわらず自動的にクローズされる必要があります!
    }
}

オブジェクト指向プログラミングのすべてのレッスン