Java プログラムで無効なユーザー入力を処理する方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

無効なユーザー入力を適切に処理することは、Java プログラミングにおいてアプリケーションの堅牢性と信頼性を確保するための重要な要素です。ユーザーがプログラムとやり取りする際に、予期しないまたは誤ったデータを入力することがあります。これらのデータが適切に管理されないと、アプリケーションがクラッシュする可能性があります。

この実験では、Java アプリケーションにおいて無効なユーザー入力を効果的に処理する方法を学びます。基本的なエラーチェックからより高度な検証方法まで、さまざまな手法を探索します。この実験が終わる頃には、ユーザーのエラーを円滑に処理し、適切なフィードバックを提供する Java プログラムを書けるようになるでしょう。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/StringManipulationGroup -.-> java/regex("RegEx") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/encapsulation("Encapsulation") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") subgraph Lab Skills java/if_else -.-> lab-414054{{"Java プログラムで無効なユーザー入力を処理する方法"}} java/regex -.-> lab-414054{{"Java プログラムで無効なユーザー入力を処理する方法"}} java/user_input -.-> lab-414054{{"Java プログラムで無効なユーザー入力を処理する方法"}} java/encapsulation -.-> lab-414054{{"Java プログラムで無効なユーザー入力を処理する方法"}} java/exceptions -.-> lab-414054{{"Java プログラムで無効なユーザー入力を処理する方法"}} end

ユーザー入力を伴う基本的な Java プログラムの作成

この最初のステップでは、ユーザー入力を収集する単純な Java プログラムを作成します。これは、入力検証手法を学ぶための基礎となります。

Java におけるユーザー入力の理解

Java には、ユーザーからの入力を収集するいくつかの方法が用意されています。コンソールアプリケーションの場合、java.util パッケージの Scanner クラスが一般的に使用されます。このクラスには、整数、浮動小数点数、文字列など、さまざまなタイプの入力を読み取るメソッドが用意されています。

入力プログラムの作成

まずは、ユーザーの年齢を尋ねてそれを表示する基本的な Java プログラムを作成しましょう。

  1. まず、WebIDE を開き、プロジェクトディレクトリに移動します。

  2. WebIDE のファイルエクスプローラーで「New File」アイコンをクリックして、新しいファイルを作成します。ファイル名を UserInputDemo.java とします。

  3. ファイルに次のコードを追加します。

import java.util.Scanner;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        // Prompt the user for their age
        System.out.print("Please enter your age: ");

        // Read the input
        int age = scanner.nextInt();

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. Ctrl + S を押すか、メニューから「File」>「Save」を選択して、ファイルを保存します。

  2. 上部メニューから「Terminal」>「New Terminal」をクリックして、WebIDE でターミナルを開きます。

Input Demo
  1. 次のコマンドを実行して、Java プログラムをコンパイルします。
javac UserInputDemo.java
  1. 次のコマンドでプログラムを実行します。
java UserInputDemo
  1. プロンプトが表示されたら、数値を入力します。たとえば、25 と入力します。次のような出力が表示されるはずです。
Please enter your age: 25
You entered: 25

無効な入力があった場合の挙動

では、無効な入力を行った場合に何が起こるか見てみましょう。再度プログラムを実行します。

java UserInputDemo

今度は、twenty - five のような非数値を入力します。次のようなエラーメッセージが表示されます。

Please enter your age: twenty-five
Exception in thread "main" java.util.InputMismatchException
 at java.base/java.util.Scanner.throwFor(Scanner.java:943)
 at java.base/java.util.Scanner.next(Scanner.java:1598)
 at java.base/java.util.Scanner.nextInt(Scanner.java:2263)
 at java.base/java.util.Scanner.nextInt(Scanner.java:2217)
 at UserInputDemo.main(UserInputDemo.java:12)

この InputMismatchException は、プログラムが数値入力(整数)を期待していたが、代わりにテキストを受け取ったために発生します。プログラムはこれをうまく処理することなくクラッシュしてしまいます。次のステップでは、このような無効な入力を適切に処理する方法を学びます。

無効な入力に対する例外処理

このステップでは、Java の例外処理メカニズムを使用して、無効な入力を処理するようにプログラムを修正します。

Java の例外の理解

Java の例外とは、プログラムの通常の実行フローを中断するイベントです。ユーザーが無効な入力を行うと、Java ランタイムシステムは何かがうまくいかなかったことを知らせるために例外をスローします。プログラムはこれらの例外をキャッチして適切に処理することができ、クラッシュすることなく済みます。

Java での例外処理の基本構造は try-catch ブロックです。

try {
    // Code that might throw an exception
} catch (ExceptionType e) {
    // Code to handle the exception
}

例外を処理するようにプログラムを修正する

ユーザーが非数値入力を行ったときに発生する InputMismatchException を処理するように、プログラムを更新しましょう。

  1. WebIDE で UserInputDemo.java ファイルを開きます。

  2. 例外処理を含むようにコードを修正します。

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        try {
            // Prompt the user for their age
            System.out.print("Please enter your age: ");

            // Read the input
            int age = scanner.nextInt();

            // Display the entered age
            System.out.println("You entered: " + age);
        } catch (InputMismatchException e) {
            // Handle the exception if non-numeric input is provided
            System.out.println("Error: Please enter a valid numeric age.");
        } finally {
            // Close the scanner in the finally block to ensure it always gets closed
            scanner.close();
        }
    }
}
  1. Ctrl + S を押してファイルを保存します。

  2. 更新したプログラムをコンパイルします。

javac UserInputDemo.java
  1. プログラムを実行します。
java UserInputDemo
  1. twenty-five のような非数値を入力してみます。クラッシュする代わりに、プログラムは次のように表示されます。
Please enter your age: twenty-five
Error: Please enter a valid numeric age.

例外処理の改善

現在の実装では例外を処理しますが、すぐに終了してしまいます。ユーザーに有効な年齢を入力する複数の試行機会を与えることで、これを改善しましょう。

  1. WebIDE で UserInputDemo.java ファイルを開きます。

  2. 複数回の試行を可能にするようにコードを修正します。

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        boolean validInput = false;
        int age = 0;

        // Keep trying until valid input is received
        while (!validInput) {
            try {
                // Prompt the user for their age
                System.out.print("Please enter your age: ");

                // Read the input
                age = scanner.nextInt();

                // If we get here, the input was valid
                validInput = true;
            } catch (InputMismatchException e) {
                // Handle the exception if non-numeric input is provided
                System.out.println("Error: Please enter a valid numeric age.");

                // Clear the invalid input from the scanner
                scanner.nextLine();
            }
        }

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. ファイルを保存します。

  2. プログラムを再度コンパイルして実行します。

javac UserInputDemo.java
java UserInputDemo
  1. まず無効な入力を行い、次に有効な入力を行ってみます。
Please enter your age: twenty-five
Error: Please enter a valid numeric age.
Please enter your age: 25
You entered: 25

これで、プログラムはユーザーに有効な入力を行う複数の機会を与えるようになりました。これは、無効な入力を円滑に処理する上で大きな改善です。

条件文を使用した入力検証の実装

例外処理に加えて、条件文を使用してユーザー入力を検証することができます。このアプローチにより、入力を処理する前にカスタムの検証ルールを実装することができます。

入力検証の理解

入力検証とは、ユーザー入力を処理する前に、特定の基準を満たしていることを確認するプロセスです。たとえば、年齢の値が数値であるだけでなく、合理的な範囲内にあることを確認したい場合があります。

プログラムに範囲検証を追加する

ユーザーが 0 から 120 の間の年齢を入力するように、プログラムを強化しましょう。

  1. WebIDE で UserInputDemo.java ファイルを開きます。

  2. 範囲検証を含むようにコードを修正します。

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        boolean validInput = false;
        int age = 0;

        // Keep trying until valid input is received
        while (!validInput) {
            try {
                // Prompt the user for their age
                System.out.print("Please enter your age (0-120): ");

                // Read the input
                age = scanner.nextInt();

                // Check if the age is within a valid range
                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    // If we get here, the input was valid
                    validInput = true;
                }
            } catch (InputMismatchException e) {
                // Handle the exception if non-numeric input is provided
                System.out.println("Error: Please enter a valid numeric age.");

                // Clear the invalid input from the scanner
                scanner.nextLine();
            }
        }

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. Ctrl + S を押してファイルを保存します。

  2. プログラムをコンパイルします。

javac UserInputDemo.java
  1. プログラムを実行します。
java UserInputDemo
  1. さまざまな入力でプログラムをテストします。

    • 有効な年齢を入力する(例:25
    Please enter your age (0-120): 25
    You entered: 25
    • 負の年齢を入力する
    Please enter your age (0-120): -5
    Error: Age must be between 0 and 120.
    Please enter your age (0-120):
    • 120 を超える年齢を入力する
    Please enter your age (0-120): 150
    Error: Age must be between 0 and 120.
    Please enter your age (0-120):
    • 非数値を入力する
    Please enter your age (0-120): twenty-five
    Error: Please enter a valid numeric age.
    Please enter your age (0-120):

より複雑な例:ユーザー登録フォームの作成

ユーザー登録フォームの複数のフィールドを検証する、より包括的な例を作成しましょう。

  1. WebIDE で UserRegistration.java という名前の新しいファイルを作成します。

  2. ファイルに次のコードを追加します。

import java.util.Scanner;

public class UserRegistration {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Get and validate username
        String username = getValidUsername(scanner);

        // Get and validate age
        int age = getValidAge(scanner);

        // Get and validate email
        String email = getValidEmail(scanner);

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);

        scanner.close();
    }

    private static String getValidUsername(Scanner scanner) {
        String username;
        boolean validUsername = false;

        do {
            System.out.print("Enter username (3-15 characters): ");
            username = scanner.nextLine().trim();

            if (username.length() < 3 || username.length() > 15) {
                System.out.println("Error: Username must be between 3 and 15 characters.");
            } else {
                validUsername = true;
            }
        } while (!validUsername);

        return username;
    }

    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    private static String getValidEmail(Scanner scanner) {
        String email;
        boolean validEmail = false;

        do {
            System.out.print("Enter your email: ");
            email = scanner.nextLine().trim();

            // Simple email validation: must contain @ and a period after @
            if (!email.contains("@") || email.indexOf('.', email.indexOf('@')) == -1) {
                System.out.println("Error: Please enter a valid email address.");
            } else {
                validEmail = true;
            }
        } while (!validEmail);

        return email;
    }
}
  1. Ctrl + S を押してファイルを保存します。

  2. プログラムをコンパイルします。

javac UserRegistration.java
  1. プログラムを実行します。
java UserRegistration
  1. プロンプトに従って、ユーザー名、年齢、およびメールアドレスを入力します。プログラムは各入力を検証し、有効なデータが入力された場合にのみ処理を続行します。

有効な入力シーケンスのサンプル:

Enter username (3-15 characters): johnsmith
Enter your age (0-120): 30
Enter your email: [email protected]

Registration Successful!
Username: johnsmith
Age: 30
Email: [email protected]

このより包括的な例は、例外処理と条件付き検証の両方を使用して、さまざまなタイプのユーザー入力を検証する方法を示しています。

正規表現を使用した入力検証

正規表現(regex)は、メールアドレス、電話番号、パスワードなどの複雑な入力パターンを検証する強力な方法を提供します。このステップでは、Java で正規表現を使用して高度な入力検証を行う方法を学びます。

正規表現の理解

正規表現は、検索パターンを定義する文字のシーケンスです。これらのパターンを使用して、文字列が特定の形式に準拠しているかどうかを検証することができます。Java は java.util.regex パッケージを提供しており、正規表現を扱うための Pattern クラスと Matcher クラスが含まれています。

UserRegistration プログラムに正規表現検証を追加する

UserRegistration プログラムを強化して、より堅牢な入力検証のために正規表現を使用しましょう。

  1. WebIDE で UserRegistration.java ファイルを開きます。

  2. 正規表現検証を含むようにファイルを修正します。

import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class UserRegistration {
    // Regular expression patterns
    private static final String USERNAME_PATTERN = "^[a-zA-Z0-9_]{3,15}$";
    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    private static final String PHONE_PATTERN = "^\\d{3}-\\d{3}-\\d{4}$";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Get and validate username
        String username = getValidUsername(scanner);

        // Get and validate age
        int age = getValidAge(scanner);

        // Get and validate email
        String email = getValidEmail(scanner);

        // Get and validate phone number
        String phone = getValidPhone(scanner);

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);
        System.out.println("Phone: " + phone);

        scanner.close();
    }

    private static String getValidUsername(Scanner scanner) {
        String username;
        boolean validUsername = false;
        Pattern pattern = Pattern.compile(USERNAME_PATTERN);

        do {
            System.out.print("Enter username (3-15 alphanumeric characters or underscore): ");
            username = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(username);
            if (!matcher.matches()) {
                System.out.println("Error: Username must be 3-15 characters long and contain only letters, numbers, or underscores.");
            } else {
                validUsername = true;
            }
        } while (!validUsername);

        return username;
    }

    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    private static String getValidEmail(Scanner scanner) {
        String email;
        boolean validEmail = false;
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);

        do {
            System.out.print("Enter your email: ");
            email = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(email);
            if (!matcher.matches()) {
                System.out.println("Error: Please enter a valid email address.");
            } else {
                validEmail = true;
            }
        } while (!validEmail);

        return email;
    }

    private static String getValidPhone(Scanner scanner) {
        String phone;
        boolean validPhone = false;
        Pattern pattern = Pattern.compile(PHONE_PATTERN);

        do {
            System.out.print("Enter your phone number (format: 123-456-7890): ");
            phone = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(phone);
            if (!matcher.matches()) {
                System.out.println("Error: Please enter a valid phone number in the format 123-456-7890.");
            } else {
                validPhone = true;
            }
        } while (!validPhone);

        return phone;
    }
}
  1. Ctrl + S を押してファイルを保存します。

  2. プログラムをコンパイルします。

javac UserRegistration.java
  1. プログラムを実行します。
java UserRegistration
  1. さまざまな入力でプログラムをテストします。

    • 無効なユーザー名(短すぎる、特殊文字を含む)を入力してみます。
    Enter username (3-15 alphanumeric characters or underscore): a$
    Error: Username must be 3-15 characters long and contain only letters, numbers, or underscores.
    Enter username (3-15 alphanumeric characters or underscore):
    • 無効なメールアドレス(@ またはドメインが欠けている)を入力してみます。
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: johndoe.com
    Error: Please enter a valid email address.
    Enter your email:
    • 無効な電話番号(形式が間違っている)を入力してみます。
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: [email protected]
    Enter your phone number (format: 123-456-7890): 1234567890
    Error: Please enter a valid phone number in the format 123-456-7890.
    Enter your phone number (format: 123-456-7890):
    • すべて有効な入力を行います。
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: [email protected]
    Enter your phone number (format: 123-456-7890): 123-456-7890
    
    Registration Successful!
    Username: johndoe
    Age: 25
    Email: [email protected]
    Phone: 123-456-7890

正規表現パターンの理解

プログラムで使用されている正規表現パターンを調べてみましょう。

  1. USERNAME_PATTERN: ^[a-zA-Z0-9_]{3,15}$

    • ^$ は、パターンが文字列全体に一致することを保証します。
    • [a-zA-Z0-9_] は、任意の文字(大文字または小文字)、数字、またはアンダースコアに一致します。
    • {3,15} は、長さが 3 から 15 文字の間であることを指定します。
  2. EMAIL_PATTERN: ^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$

    • このパターンは、一般的なルールに従ってメールアドレスを検証します。
    • メールアドレスにユーザー名部分、@ 記号、およびドメインが含まれていることを保証します。
  3. PHONE_PATTERN: ^\\d{3}-\\d{3}-\\d{4}$

    • \\d は任意の数字(0 - 9)に一致します。
    • {3}{4} は、数字の数を指定します。
    • - は、リテラルのハイフン文字に一致します。

正規表現は入力検証に強力なツールですが、複雑になることがあります。正規表現に慣れるにつれて、アプリケーションにより洗練された検証パターンを作成することができます。

完全なフォーム検証システムの作成

この最後のステップでは、これまで学んだすべての技術を組み込んだ完全なフォーム検証システムを構築します。異なるアプリケーションに簡単に拡張できる、よりモジュール化された再利用可能な検証システムを作成します。

検証ユーティリティクラスの作成

まず、検証メソッドをカプセル化したユーティリティクラスを作成しましょう。

  1. WebIDE で InputValidator.java という名前の新しいファイルを作成します。

  2. ファイルに次のコードを追加します。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Utility class for validating user input
 */
public class InputValidator {
    // Regular expression patterns
    private static final String USERNAME_PATTERN = "^[a-zA-Z0-9_]{3,15}$";
    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    private static final String PHONE_PATTERN = "^\\d{3}-\\d{3}-\\d{4}$";
    private static final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";

    /**
     * Validates a username
     * @param username The username to validate
     * @return true if the username is valid, false otherwise
     */
    public static boolean isValidUsername(String username) {
        if (username == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(USERNAME_PATTERN);
        Matcher matcher = pattern.matcher(username);
        return matcher.matches();
    }

    /**
     * Validates an email address
     * @param email The email to validate
     * @return true if the email is valid, false otherwise
     */
    public static boolean isValidEmail(String email) {
        if (email == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    /**
     * Validates a phone number
     * @param phone The phone number to validate
     * @return true if the phone number is valid, false otherwise
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(PHONE_PATTERN);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }

    /**
     * Validates an age
     * @param age The age to validate
     * @return true if the age is valid, false otherwise
     */
    public static boolean isValidAge(int age) {
        return age >= 0 && age <= 120;
    }

    /**
     * Validates a password
     * @param password The password to validate
     * @return true if the password is valid, false otherwise
     */
    public static boolean isValidPassword(String password) {
        if (password == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(PASSWORD_PATTERN);
        Matcher matcher = pattern.matcher(password);
        return matcher.matches();
    }

    /**
     * Gets the error message for an invalid username
     * @return The error message
     */
    public static String getUsernameErrorMessage() {
        return "Username must be 3-15 characters long and contain only letters, numbers, or underscores.";
    }

    /**
     * Gets the error message for an invalid email
     * @return The error message
     */
    public static String getEmailErrorMessage() {
        return "Please enter a valid email address.";
    }

    /**
     * Gets the error message for an invalid phone number
     * @return The error message
     */
    public static String getPhoneErrorMessage() {
        return "Please enter a valid phone number in the format 123-456-7890.";
    }

    /**
     * Gets the error message for an invalid age
     * @return The error message
     */
    public static String getAgeErrorMessage() {
        return "Age must be between 0 and 120.";
    }

    /**
     * Gets the error message for an invalid password
     * @return The error message
     */
    public static String getPasswordErrorMessage() {
        return "Password must be at least 8 characters long and contain at least one digit, one lowercase letter, one uppercase letter, one special character, and no whitespace.";
    }
}
  1. Ctrl + S を押してファイルを保存します。

完全な登録フォームの作成

次に、InputValidator クラスを使用した新しいバージョンの登録フォームを作成しましょう。

  1. WebIDE で CompleteRegistrationForm.java という名前の新しいファイルを作成します。

  2. ファイルに次のコードを追加します。

import java.util.Scanner;

public class CompleteRegistrationForm {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Collect and validate user information
        String username = getValidInput(scanner, "Username", InputValidator::isValidUsername, InputValidator.getUsernameErrorMessage());
        int age = getValidAge(scanner);
        String email = getValidInput(scanner, "Email", InputValidator::isValidEmail, InputValidator.getEmailErrorMessage());
        String phone = getValidInput(scanner, "Phone number (format: 123-456-7890)", InputValidator::isValidPhone, InputValidator.getPhoneErrorMessage());
        String password = getValidInput(scanner, "Password", InputValidator::isValidPassword, InputValidator.getPasswordErrorMessage());

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);
        System.out.println("Phone: " + phone);
        System.out.println("Password: " + maskPassword(password));

        scanner.close();
    }

    /**
     * Generic method to get valid input from the user
     * @param scanner The scanner to read input
     * @param fieldName The name of the field being validated
     * @param validator The validation function
     * @param errorMessage The error message to display
     * @return The validated input
     */
    private static String getValidInput(Scanner scanner, String fieldName, java.util.function.Predicate<String> validator, String errorMessage) {
        String input;
        boolean validInput = false;

        do {
            System.out.print("Enter your " + fieldName + ": ");
            input = scanner.nextLine().trim();

            if (!validator.test(input)) {
                System.out.println("Error: " + errorMessage);
            } else {
                validInput = true;
            }
        } while (!validInput);

        return input;
    }

    /**
     * Gets a valid age from the user
     * @param scanner The scanner to read input
     * @return The validated age
     */
    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (!InputValidator.isValidAge(age)) {
                    System.out.println("Error: " + InputValidator.getAgeErrorMessage());
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    /**
     * Masks a password for display
     * @param password The password to mask
     * @return The masked password
     */
    private static String maskPassword(String password) {
        if (password == null || password.isEmpty()) {
            return "";
        }
        return "*".repeat(password.length());
    }
}
  1. Ctrl + S を押してファイルを保存します。

  2. 両方の Java ファイルをコンパイルします。

javac InputValidator.java
javac CompleteRegistrationForm.java
  1. 登録フォームプログラムを実行します。
java CompleteRegistrationForm
  1. プロンプトに従って、各フィールドに有効な情報を入力します。プログラムは InputValidator クラスで定義されたルールに従って各入力を検証します。

サンプルの対話内容:

Enter your Username: john_doe
Enter your age (0-120): 35
Enter your Email: [email protected]
Enter your Phone number (format: 123-456-7890): 123-456-7890
Enter your Password: weakpw
Error: Password must be at least 8 characters long and contain at least one digit, one lowercase letter, one uppercase letter, one special character, and no whitespace.
Enter your Password: P@ssw0rd123

Registration Successful!
Username: john_doe
Age: 35
Email: [email protected]
Phone: 123-456-7890
Password: ***********

このアプローチの利点

この最後の例で取ったアプローチにはいくつかの利点があります。

  1. モジュール性:検証ロジックが再利用可能なユーティリティクラスに分離されています。
  2. 拡張性:新しい検証ルールを InputValidator クラスに簡単に追加できます。
  3. 保守性:エラーメッセージが集中管理されており、簡単に更新できます。
  4. コードの再利用getValidInput メソッドは汎用的で、さまざまなタイプの入力に使用できます。
  5. セキュリティ:パスワードはユーザーに表示される際にマスクされます。

この設計は良好なソフトウェアエンジニアリングの原則に従っており、異なるアプリケーションに対して検証システムを簡単に適応させることができます。

まとめ

この実験では、Java プログラムにおいて無効なユーザー入力を効果的に処理する方法を学びました。入力処理の基本的な理解から、包括的な検証システムの実装まで進歩しました。ここでは、あなたが達成したことをまとめます。

  1. Scanner クラスを使用してユーザー入力を収集する基本的な Java プログラムを作成しました。
  2. 無効な入力を適切に管理するための例外処理を実装しました。
  3. 入力が特定の基準を満たすことを保証するための条件付き検証を追加しました。
  4. 高度なパターンベースの検証に正規表現を使用しました。
  5. ユーティリティクラスを使用してモジュール化された再利用可能な検証システムを構築しました。

これらの技術は、ユーザー入力の予測不可能な性質に対応できる堅牢な Java アプリケーションを開発するために不可欠です。無効な入力を適切に検証して処理することで、プログラムのクラッシュを防ぎ、データの整合性を維持し、より良いユーザー体験を提供することができます。

Java プログラミングの旅を続ける際に、入力検証はエラーを防ぐだけでなく、セキュリティと使いやすさを向上させることにも関係していることを忘れないでください。この実験で学んだ原則は、単純なコンソールプログラムから複雑な Web アプリケーションまで、さまざまな種類のアプリケーションに適用できます。