Как обрабатывать некорректный ввод пользователя в Java-программе

JavaBeginner
Практиковаться сейчас

Введение

Обработка некорректных пользовательских вводов является важной частью программирования на Java, которая обеспечивает надежность и устойчивость ваших приложений. Когда пользователи взаимодействуют с вашими программами, они могут вводить неожиданные или неверные данные, которые могут привести к сбою приложения, если не будут правильно обработаны.

В этом LabEx вы научитесь эффективно обрабатывать некорректные пользовательские вводы в приложениях на Java. Вы изучите различные методы, начиная от простой проверки ошибок и заканчивая более продвинутыми методами валидации. По завершении этого LabEx вы сможете писать программы на Java, которые элегантно обрабатывают ошибки пользователей и дают соответствующую обратную связь.

Создание простой Java-программы с пользовательским вводом

На этом первом этапе мы создадим простую Java-программу, которая будет собирать пользовательский ввод. Это послужит основой для изучения методов валидации ввода.

Понимание пользовательского ввода в Java

Java предоставляет несколько способов для сбора ввода от пользователей. Для консольных приложений обычно используется класс Scanner из пакета java.util. Этот класс предоставляет методы для чтения различных типов ввода, таких как целые числа, числа с плавающей точкой и строки.

Создание программы для ввода

Начнем с создания простой Java-программы, которая запрашивает возраст пользователя и выводит его на экран.

  1. Сначала откройте WebIDE и перейдите в каталог проекта:

  2. Создайте новый файл, нажав на иконку "New File" в проводнике файлов WebIDE. Назовите файл 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. Откройте терминал в WebIDE, нажав "Terminal" > "New Terminal" в верхнем меню.

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. Откройте файл UserInputDemo.java в WebIDE.

  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. Откройте файл UserInputDemo.java в WebIDE.

  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. Откройте файл UserInputDemo.java в WebIDE.

  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. Создайте новый файл с именем UserRegistration.java в WebIDE.

  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: john.smith@example.com

Registration Successful!
Username: johnsmith
Age: 30
Email: john.smith@example.com

Этот более полноценный пример демонстрирует, как валидировать различные типы пользовательского ввода с использованием как обработки исключений, так и условной валидации.

Использование регулярных выражений для валидации ввода

Регулярные выражения (regex) предоставляют мощный способ валидации сложных шаблонов ввода, таких как адреса электронной почты, номера телефонов и пароли. На этом этапе мы научимся использовать регулярные выражения в Java для выполнения расширенной валидации ввода.

Понимание регулярных выражений

Регулярное выражение - это последовательность символов, которая определяет шаблон поиска. Эти шаблоны можно использовать для проверки, соответствует ли строка определенному формату. Java предоставляет пакет java.util.regex, который включает классы Pattern и Matcher для работы с регулярными выражениями.

Добавление валидации с использованием регулярных выражений в нашу программу UserRegistration

Давайте улучшим нашу программу UserRegistration, чтобы использовать регулярные выражения для более надежной валидации ввода:

  1. Откройте файл UserRegistration.java в WebIDE.

  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: john.doe@example.com
    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: john.doe@example.com
    Enter your phone number (format: 123-456-7890): 123-456-7890
    
    Registration Successful!
    Username: johndoe
    Age: 25
    Email: john.doe@example.com
    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. Создайте новый файл с именем InputValidator.java в WebIDE.

  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. Создайте новый файл с именем CompleteRegistrationForm.java в WebIDE.

  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: john.doe@example.com
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: john.doe@example.com
Phone: 123-456-7890
Password: ***********

Преимущества данного подхода

Подход, который мы использовали в этом последнем примере, имеет несколько преимуществ:

  1. Модульность: Логика валидации вынесена в повторно используемый вспомогательный класс.
  2. Расширяемость: Новые правила валидации можно легко добавить в класс InputValidator.
  3. Удобство поддержки: Сообщения об ошибках централизованы и могут быть легко обновлены.
  4. Повторное использование кода: Метод getValidInput является универсальным и может быть использован для различных типов ввода.
  5. Безопасность: Пароль маскируется при отображении пользователю.

Этот дизайн соответствует хорошим принципам软件工程 и позволяет легко адаптировать систему валидации для различных приложений.

Резюме

В этом практическом занятии вы научились эффективно обрабатывать некорректный ввод пользователя в Java-программах. Вы продвинулись от базового понимания обработки ввода до реализации комплексной системы валидации. Вот краткое резюме того, что вы достигли:

  1. Создали базовую Java-программу, которая собирает ввод пользователя с использованием класса Scanner
  2. Реализовали обработку исключений для элегантного управления некорректным вводом
  3. Добавили условную валидацию, чтобы убедиться, что ввод соответствует определенным критериям
  4. Использовали регулярные выражения для расширенной валидации на основе шаблонов
  5. Создали модульную и повторно используемую систему валидации с помощью вспомогательного класса

Эти техники являются важными для разработки надежных Java-приложений, которые могут обрабатывать непредсказуемую природу ввода пользователя. Правильно валидируя и обрабатывая некорректный ввод, вы можете предотвратить сбои программы, сохранить целостность данных и обеспечить лучший пользовательский опыт.

По мере того, как вы продолжите свой путь в программировании на Java, помните, что валидация ввода - это не только предотвращение ошибок, но и улучшение безопасности и удобства использования. Принципы, которые вы изучили в этом практическом занятии, можно применить к различным типам приложений, от простых консольных программ до сложных веб-приложений.