Menu
CoddyTech

回顾:已验证的用户

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 63 课,共 87 课。

challenge icon

挑战

简单

我们来构建一个完整的用户注册系统,验证输入数据,并使用自定义异常准确说明出了什么问题!你会综合运用本章的所有内容:自定义的受检异常和非受检异常、异常层次结构,以及使用可自动关闭的验证器进行 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 在线编译器