Menu
Coddy logo textTech

Повторение — Validated User

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 63 из 87.

challenge icon

Задание

Легко

Давайте создадим полноценную систему регистрации пользователей, которая проверяет входные данные и использует пользовательские исключения, чтобы точно сообщить, что пошло не так! Вы объедините все знания из этой главы: пользовательские проверяемые (checked) и непроверяемые (unchecked) исключения, иерархию исключений и конструкцию try-with-resources с автоматически закрываемым валидатором.

Вы распределите свой код по пяти файлам:

  • ValidationException.java: Создайте проверяемое исключение, которое будет служить базовым для всех ошибок валидации. Это исключение должно расширять Exception и включать конструктор, принимающий сообщение.
  • InvalidUsernameException.java: Создайте проверяемое исключение для ошибок валидации имени пользователя. Оно должно расширять ваш класс ValidationException, создавая небольшую иерархию исключений. Включите конструктор, который принимает сообщение и передает его родителю.
  • InvalidAgeException.java: Создайте непроверяемое исключение для ошибок, связанных с возрастом (например, отрицательный возраст, что представляет собой программную ошибку). Оно должно расширять RuntimeException и иметь конструктор, принимающий сообщение.
  • UserValidator.java: Создайте класс, реализующий AutoCloseable, чтобы имитировать сессию валидации, которая должна быть правильно закрыта. Ваш валидатор должен:

    Выводить Validator session started в конструкторе.

    Иметь метод validateUsername(String username), который выбрасывает InvalidUsernameException, если имя пользователя равно null, пустое или короче 3 символов (с сообщением "Username must be at least 3 characters"). В противном случае выводить Username '[username]' is valid.

    Иметь метод validateAge(int age), который выбрасывает InvalidAgeException, если возраст отрицательный (с сообщением "Age cannot be negative: [age]"). Если возраст меньше 13, выбрасывать ValidationException с сообщением "Must be at least 13 years old". В противном случае выводить Age [age] is valid.

    Реализовать метод close(), который выводит Validator session closed.

  • Main.java: Объедините вашу систему валидации! Вы получите два входных значения: имя пользователя (String) и возраст (integer).

    Используйте try-with-resources для создания UserValidator. Внутри блока try сначала проверьте имя пользователя, затем проверьте возраст. Если обе проверки пройдены, выведите User registration successful!

    Перехватите InvalidUsernameException и выведите Username error: [message]. Перехватите InvalidAgeException и выведите Age error: [message]. Перехватите ValidationException (родительский класс) и выведите Validation error: [message].

    Валидатор должен автоматически закрываться независимо от того, прошла валидация успешно или нет!

Вы получите два входных значения по порядку: имя пользователя (String) и возраст (integer).

Эта задача объединяет всю главу: вы построите иерархию исключений с ValidationException в качестве родителя, будете уместно использовать как проверяемые, так и непроверяемые исключения, и обеспечите своевременную очистку ресурса валидатора с помощью try-with-resources. Обратите внимание, как перехват родительского ValidationException после его дочернего InvalidUsernameException позволяет сначала обрабатывать специфические случаи, при этом все равно отлавливая другие ошибки валидации!

Попробуйте сами

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 (parent) и выведите "Validation error: [message]"
        
        // Note: Валидатор должен закрываться автоматически независимо от успеха или неудачи!
    }
}

Все уроки раздела Объектно-ориентированное программирование