Menu
CoddyTech

Ôn tập: người dùng đã xác thực

Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 63 trên 87.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống đăng ký người dùng hoàn chỉnh, có thể xác thực dữ liệu đầu vào và dùng các ngoại lệ tùy chỉnh để cho biết chính xác vấn đề là gì! Bạn sẽ kết hợp mọi nội dung trong chương này: ngoại lệ có kiểm tra và không kiểm tra tùy chỉnh, hệ thống phân cấp ngoại lệ và try-with-resources với trình xác thực có thể tự đóng.

Bạn sẽ sắp xếp code trong năm tệp:

  • ValidationException.java: Tạo một ngoại lệ có kiểm tra làm ngoại lệ cơ sở cho mọi lỗi xác thực. Ngoại lệ này cần kế thừa Exception và có hàm khởi tạo nhận một thông báo.
  • InvalidUsernameException.java: Tạo một ngoại lệ có kiểm tra dành cho các lỗi xác thực tên người dùng. Ngoại lệ này cần kế thừa lớp ValidationException để tạo một hệ thống phân cấp ngoại lệ đơn giản. Thêm hàm khởi tạo nhận một thông báo và chuyển thông báo đó cho lớp cha.
  • InvalidAgeException.java: Tạo một ngoại lệ không kiểm tra dành cho các lỗi liên quan đến tuổi, chẳng hạn như tuổi âm, vốn là lỗi lập trình. Ngoại lệ này cần kế thừa RuntimeException và có hàm khởi tạo nhận một thông báo.
  • UserValidator.java: Tạo một lớp triển khai AutoCloseable để mô phỏng một phiên xác thực cần được đóng đúng cách. Trình xác thực của bạn cần:
  • In Validator session started trong hàm khởi tạo.

    Có phương thức validateUsername(String username) ném InvalidUsernameException nếu tên người dùng là null, rỗng hoặc có ít hơn 3 ký tự (với thông báo "Username must be at least 3 characters"). Nếu không, in Username '[username]' is valid.

    Có phương thức validateAge(int age) ném InvalidAgeException nếu tuổi là số âm (với thông báo "Age cannot be negative: [age]"). Nếu tuổi nhỏ hơn 13, ném ValidationException với thông báo "Must be at least 13 years old". Nếu không, in Age [age] is valid.

    Triển khai close() để in Validator session closed.

  • Main.java: Kết hợp hệ thống xác thực của bạn! Bạn sẽ nhận hai đầu vào: tên người dùng (String) và tuổi (số nguyên).

    Dùng try-with-resources để tạo một UserValidator. Bên trong khối try, trước tiên xác thực tên người dùng, sau đó xác thực tuổi. Nếu cả hai đều hợp lệ, in User registration successful!

    Bắt InvalidUsernameException và in Username error: [message]. Bắt InvalidAgeException và in Age error: [message]. Bắt ValidationException (lớp cha) và in Validation error: [message].

    Trình xác thực cần tự động đóng dù quá trình xác thực thành công hay thất bại!

Bạn sẽ nhận hai đầu vào theo thứ tự: tên người dùng (String) và tuổi (số nguyên).

Thử thách này kết hợp toàn bộ nội dung của chương: bạn sẽ xây dựng một hệ thống phân cấp ngoại lệ với ValidationException làm lớp cha, sử dụng phù hợp cả ngoại lệ có kiểm tra lẫn không kiểm tra, đồng thời đảm bảo tài nguyên trình xác thực luôn được dọn dẹp bằng try-with-resources. Hãy chú ý cách bắt lớp cha ValidationException sau lớp con InvalidUsernameException giúp bạn xử lý các trường hợp cụ thể trước, đồng thời vẫn bắt được những lỗi xác thực khác!

Tự làm thử

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Đọc các đầu vào
        String username = scanner.nextLine();
        int age = scanner.nextInt();
        
        // TODO: Dùng try-with-resources để tạo UserValidator
        // Trong khối lệnh try:
        //   1. Kiểm tra tên người dùng
        //   2. Kiểm tra tuổi
        //   3. Nếu cả hai đều hợp lệ, in ra "User registration successful!"
        
        // TODO: Bắt InvalidUsernameException và in ra "Username error: [message]"
        
        // TODO: Bắt InvalidAgeException và in ra "Age error: [message]"
        
        // TODO: Bắt ValidationException (lớp cha) và in ra "Validation error: [message]"
        
        // Lưu ý: Bộ kiểm tra phải tự động đóng dù thành công hay thất bại!
    }
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Java online