復習 - ユーザーのバリデーション
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/87。
チャレンジ
簡単入力データを検証し、カスタム例外を使用して何が問題だったかを正確に伝える、完全なユーザー登録システムを構築しましょう!この章で学んだすべてを組み合わせます。カスタムのチェック例外(検査例外)と非チェック例外(非検査例外)、例外の階層構造、そして 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: バリデータは、成功か失敗かにかかわらず自動的にクローズされる必要があります!
}
}
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造