Menu
Coddy logo textTech

Podsumowanie – zweryfikowany użytkownik

Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 63 z 87.

challenge icon

Wyzwanie

Łatwy

Zbudujmy kompletny system rejestracji użytkowników, który weryfikuje dane wejściowe i używa niestandardowych wyjątków, aby dokładnie informować, co poszło nie tak! Połączysz wszystko z tego rozdziału: niestandardowe wyjątki sprawdzane i niesprawdzane, hierarchię wyjątków oraz try-with-resources z walidatorem, który można automatycznie zamknąć.

Rozmieścisz swój kod w pięciu plikach:

  • ValidationException.java: Utwórz sprawdzany wyjątek, który będzie klasą bazową dla wszystkich błędów walidacji. Ten wyjątek powinien rozszerzać Exception i zawierać konstruktor przyjmujący komunikat.
  • InvalidUsernameException.java: Utwórz sprawdzany wyjątek dla błędów walidacji nazwy użytkownika. Powinien rozszerzać klasę ValidationException, tworząc niewielką hierarchię wyjątków. Dodaj konstruktor przyjmujący komunikat i przekazujący go do klasy nadrzędnej.
  • InvalidAgeException.java: Utwórz niesprawdzany wyjątek dotyczący błędów związanych z wiekiem (takich jak wiek ujemny, który wskazuje na błędy programistyczne). Powinien rozszerzać RuntimeException i zawierać konstruktor przyjmujący komunikat.
  • UserValidator.java: Utwórz klasę implementującą AutoCloseable, aby zasymulować sesję walidacji, którą należy prawidłowo zamknąć. Twój walidator powinien:

    Wypisywać Validator session started w konstruktorze.

    Zawierać metodę validateUsername(String username), która zgłasza InvalidUsernameException, jeśli nazwa użytkownika ma wartość null, jest pusta lub ma mniej niż 3 znaki (z komunikatem "Username must be at least 3 characters"). W przeciwnym razie wypisuje Username '[username]' is valid.

    Zawierać metodę validateAge(int age), która zgłasza InvalidAgeException, jeśli wiek jest ujemny (z komunikatem "Age cannot be negative: [age]"). Jeśli wiek jest mniejszy niż 13, zgłoś ValidationException z komunikatem "Must be at least 13 years old". W przeciwnym razie wypisz Age [age] is valid.

    Zaimplementować close(), aby wypisywała Validator session closed.

  • Main.java: Połącz swój system walidacji! Otrzymasz dwa dane wejściowe: nazwę użytkownika (String) i wiek (liczbę całkowitą).

    Użyj try-with-resources, aby utworzyć obiekt UserValidator. W bloku try najpierw zweryfikuj nazwę użytkownika, a następnie wiek. Jeśli oba sprawdzenia się powiodą, wypisz User registration successful!

    Przechwyć InvalidUsernameException i wypisz Username error: [message]. Przechwyć InvalidAgeException i wypisz Age error: [message]. Przechwyć ValidationException (wyjątek nadrzędny) i wypisz Validation error: [message].

    Walidator powinien zamknąć się automatycznie, niezależnie od tego, czy walidacja zakończy się powodzeniem, czy nie!

Otrzymasz kolejno dwa dane wejściowe: nazwę użytkownika (String) i wiek (liczbę całkowitą).

To wyzwanie łączy zagadnienia z całego rozdziału: utworzysz hierarchię wyjątków z ValidationException jako klasą nadrzędną, odpowiednio użyjesz wyjątków sprawdzanych i niesprawdzanych oraz zadbasz o to, by zasób walidatora był zawsze zwalniany za pomocą try-with-resources. Zwróć uwagę, jak przechwycenie wyjątku nadrzędnego ValidationException po jego wyjątku potomnym InvalidUsernameException pozwala najpierw obsłużyć konkretne przypadki, a jednocześnie przechwycić pozostałe błędy walidacji!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Odczytaj dane wejściowe
        String username = scanner.nextLine();
        int age = scanner.nextInt();
        
        // TODO: Użyj try-with-resources, aby utworzyć UserValidator
        // Wewnątrz bloku try:
        //   1. Sprawdź poprawność nazwy użytkownika
        //   2. Sprawdź poprawność wieku
        //   3. Jeśli obie wartości są poprawne, wypisz "User registration successful!"
        
        // TODO: Przechwyć InvalidUsernameException i wypisz "Username error: [message]"
        
        // TODO: Przechwyć InvalidAgeException i wypisz "Age error: [message]"
        
        // TODO: Przechwyć ValidationException (klasę nadrzędną) i wypisz "Validation error: [message]"
        
        // Uwaga: Walidator powinien zamknąć się automatycznie niezależnie od powodzenia lub niepowodzenia!
    }
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online