ホーム › 入力値バリデーション › V-01
V-01: 数値・文字列・日付のバリデーション
ユーザーが入力した値を検証する基本パターンを解説します。 数値変換の例外処理、正規表現によるフォーマットチェック、日付の妥当性確認、そして複数エラーを一括で集約する方法を学びましょう。
いつ使うか
- Web フォームから受け取った文字列が正しい形式かチェックするとき
- CSV や Excel から読み込んだデータを処理する前に品質チェックするとき
- REST API で受け取ったリクエストパラメータを検証するとき
- 設定ファイルの値が期待する範囲内かチェックするとき
バリデーションを行うべき場所(システム境界)
バリデーションは「システムの外からデータが入ってくる場所」で必ず行います。 信頼できないデータをそのまま処理すると、予期しない例外や誤った計算結果を引き起こします。
| 場所 | 具体例 |
|---|---|
| ユーザー入力受け付け時 | フォーム送信、コマンドライン引数 |
| API リクエスト受信時 | REST API のリクエストボディ、クエリパラメータ |
| 外部ファイル読み込み時 | CSV・JSON・Excel ファイルのパース後 |
サンプルコード
Java 8 では isEmpty() で空文字を確認し、スペースのみの入力は trim().isEmpty() で確認します。NumberFormatException・DateTimeParseException を catch して、ユーザーへの分かりやすいメッセージに変換しています。
よくあるミス・注意点
例外はユーザーへの分かりやすいメッセージに変換する
Integer.parseInt() で例外が発生してもそのまま伝播させず、 「年齢は数値で入力してください」のようなユーザーが理解できるメッセージに変換して返しましょう。 スタックトレースをそのまま画面に表示するのは避けてください。
isEmpty() と isBlank() の違いに注意する
isEmpty() は空文字(長さ0)のみを検出します。スペースだけの入力 " " は isEmpty() では検出できません。 Java 11 以降は isBlank() を、Java 8 では trim().isEmpty() を使いましょう。
メールアドレスの完全な検証は正規表現だけでは不可能
正規表現はメールアドレスの「形式」を確認するだけです。 そのアドレスが実際に存在するかどうかは確認できません。 実務では形式チェックの後に確認メールを送信する「メール認証」を組み合わせるのが標準的な方法です。
複数のエラーは1つ見つかったら即 return せず、全エラーを集約する
バリデーションエラーが複数ある場合、最初のエラーだけ表示して終わると、 ユーザーは修正するたびに次のエラーが出て何度もフォームを送り直すことになります。 全てのエラーをリストに集約して一度に返すことで UX が改善します。
テストする観点
- 正常値(有効な整数・メールアドレス・日付)が true を返すこと
- 空文字(
"")と null が false またはエラーを返すこと(境界値) - スペースのみ(
" ")が false またはエラーを返すこと - 年齢の境界値(0、150、-1、151)が正しく検証されること
- メールアドレスの形式違い(
user@example、@example.com)が false を返すこと - 存在しない日付(2024-13-01、2024-02-30)が false を返すこと
- 複合バリデーションで全てのエラーが集約されて返ること