Ô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.
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ừaExceptionvà 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ớpValidationExceptionđể 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ừaRuntimeExceptionvà 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 khaiAutoCloseableđể 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: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ệ, inUser registration successful!Bắt
InvalidUsernameExceptionvà inUsername error: [message]. BắtInvalidAgeExceptionvà inAge error: [message]. BắtValidationException(lớp cha) và inValidation 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!
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.
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
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh10Xử lý ngoại lệ trong OOP
Phân cấp lớp ngoại lệNgoại lệ tùy chỉnhLỗi có kiểm tra và không kiểm traMẫu try-with-resourcesÔn tập: người dùng đã xác thực2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online