回顾:已验证的用户
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 63 课,共 87 课。
挑战
简单我们来构建一个完整的用户注册系统,验证输入数据,并使用自定义异常准确说明出了什么问题!你会综合运用本章的所有内容:自定义的受检异常和非受检异常、异常层次结构,以及使用可自动关闭的验证器进行 try-with-resources。
你将把代码分成 5 个文件:
ValidationException.java:创建一个受检异常,作为所有验证错误的基类。这个异常应继承Exception,并包含一个接收消息的构造函数。InvalidUsernameException.java:创建一个用于用户名验证失败的受检异常。它应继承ValidationException类,从而构成一个简单的异常层次结构。添加一个接收消息并将其传递给父类的构造函数。InvalidAgeException.java:创建一个用于年龄相关错误的非受检异常,例如负数年龄,因为这类情况代表编程错误。它应继承RuntimeException,并包含一个接收消息的构造函数。UserValidator.java:创建一个实现AutoCloseable的类,用来模拟一个应当正确关闭的验证会话。验证器应满足以下要求:在构造函数中打印
Validator session started。添加一个
validateUsername(String username)方法。如果用户名为 null、为空或少于 3 个字符,则抛出InvalidUsernameException(消息为"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)和年龄(整数)。使用 try-with-resources 创建一个
UserValidator。在 try 代码块中,先验证用户名,再验证年龄。如果两项都通过,则打印User registration successful!捕获
InvalidUsernameException并打印Username error: [message]。捕获InvalidAgeException并打印Age error: [message]。捕获ValidationException(父类)并打印Validation error: [message]。无论验证成功还是失败,验证器都应自动关闭!
你会按顺序收到两个输入:用户名(String)和年龄(整数)。
这个挑战综合运用了本章的全部内容:你将构建一个以 ValidationException 为父类的异常层次结构,恰当地使用受检异常和非受检异常,并通过 try-with-resources 确保验证器资源始终得到清理。注意,在捕获子类 InvalidUsernameException 后再捕获父类 ValidationException,这样你就能先处理特定情况,同时捕获其他验证错误!
亲手试试
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. 验证用户名
// 2. 验证年龄
// 3. 如果两项验证都通过,打印 "User registration successful!"
// TODO:捕获 InvalidUsernameException 并打印 "Username error: [message]"
// TODO:捕获 InvalidAgeException 并打印 "Age error: [message]"
// TODO:捕获 ValidationException(父类)并打印 "Validation error: [message]"
// 注意:无论验证成功还是失败,验证器都应自动关闭!
}
}
面向对象编程中的所有课
自己练习: Java 在线编译器