Podsumowanie – zweryfikowany użytkownik
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 63 z 87.
Wyzwanie
ŁatwyZbudujmy 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ćExceptioni 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ćRuntimeExceptioni 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 startedw konstruktorze.Zawierać metodę
validateUsername(String username), która zgłaszaInvalidUsernameException, 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 wypisujeUsername '[username]' is valid.Zawierać metodę
validateAge(int age), która zgłaszaInvalidAgeException, jeśli wiek jest ujemny (z komunikatem"Age cannot be negative: [age]"). Jeśli wiek jest mniejszy niż 13, zgłośValidationExceptionz komunikatem"Must be at least 13 years old". W przeciwnym razie wypiszAge [age] is valid.Zaimplementować
close(), aby wypisywałaValidator 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ą, wypiszUser registration successful!Przechwyć
InvalidUsernameExceptioni wypiszUsername error: [message]. PrzechwyćInvalidAgeExceptioni wypiszAge error: [message]. PrzechwyćValidationException(wyjątek nadrzędny) i wypiszValidation 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
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online