迷你项目练习题4用户登录与用户注册(异常处理)

题目

(自定义异常)完成某个计费系统的用户登录和注册模块,要求如下: 1) 创建一个 User 类,包括:用户登录名(username)、密码(password)、用户真实姓名(name)、电子邮件地址(email)属性和相应的构造方法及 set/get 方法。
2) 创建两个自定义异常类,一个 LoginException,表示登录异常。一个 RegisterException, 表示注册异常。自定义的两个异常,都要求有一个接受字符串类型参数的构造方法。
3) 创建一个 UserBiz 接口,该接口中定义两个方法:
void register(String username, String password, String password2, String name, String email) throws RegisterException //用户注册 void login(String username, String password) throws LoginException //用户登录
其中 register 方法接受两个 password 参数,原因是:在用户注册时,需要输入两遍 password,只有两次输入的 password 一致,才允许注册。
4) 创建 UserBiz 接口的实现类。其中
为该实现类创建一个属性,该属性为一个 Map,用来保存已注册的用户信息。 Map 的键为用户登录名,值为登录名对应的 User 对象。初始情况下,Map 中保存的对象为以下两个:
在这里插入图片描述
register 方法在以下两种情况下抛出异常:
1) username 在 Map 中已存在
2) 两次输入的 password 不一致
login 方法在以下两种情况下抛出异常:
1) username 不存在
2) username 和 password 不匹配
5) 创建一个 UserView 接口,该接口中定义两个方法: void login();
void register();
6) 创建 UserView 接口的实现类。
该实现类的 login 方法中,利用命令行,让用户输入用户名和密码,之后调用
UserBiz 中的 login 方法。部分代码如下:
void login(){
System.out.println(“请输入用户名:”); String username = /读入用户名…/; System.out.println(“请输入密码”); String password = /读入密码/;
//调用 UserBiz 中的 login 方法
}
该类的 register 方法采用类似的方法,让用户输入注册时需要的信息,然后调用
UserBiz 中的 register 方法。 注意:
1、 密码应该让用户输入两遍。
2、 UserViewImpl 中应当有一个 UserBiz 类型的属性 7) 编写测试代码。 类图如下:
在这里插入图片描述

分析

HashMap底层原理:数组加链表

User类

/**
 * 用户类(-表示private)
 * -username:String 用户登录名
 * -password:String 密码
 * -name:String     用户真实姓名
 * -email:String    电子邮件地址
 */
public class User {
    //用户登录名 密码 用户真实姓名 电子邮件地址
    private String username;
    private String password;
    private String name;
    private String email;
    //无参构造
    public User() {
    }
    //有参构造
    public User(String username, String password, String name, String email) {
        this.username = username;
        this.password = password;
        this.name = name;
        this.email = email;
    }
    //Getter&Setter
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "用户{" +
                "用户名='" + username + '\'' +
                ", 真实姓名='" + name + '\'' +
                ", 电子邮箱='" + email + '\'' +
                '}';
    }
}

RegisterException类

/**
 * 注册异常
 */
public class RegisterException extends Exception{
    //无参构造
    public RegisterException() {
    }
    //有参构造
    public RegisterException(String message) {
        super(message);
    }
}

LoginException类

/**
 * 登录异常
 */
public class LoginException extends Exception{
    //无参构造
    public LoginException() {
    }
    //有参构造
    public LoginException(String message) {
        super(message);
    }
}

UserBiz接口

/**
 * 用户服务接口(+表示public)
 * +login(String username, String password):void
 * +register(String username,String password,String password2,String name,String email):void
 */
public interface  UserBiz {
    //注册方法
    void register(String username,String password,String password2,String name,String email)throws RegisterException;
    //登录方法
    void login(String username, String password)throws LoginException;
}

UserBizImpl类

import java.util.HashMap;
import java.util.Map;
/**
 * 用户服务实现类
 * -userMap:Map 用来保存已注册的用户信息
 * Map 的键为用户登录名,值为登录名对应的User对象。
 */
public class UserBizImpl implements UserBiz{
    private Map<String,User> userMap;
    //无参构造
    public UserBizImpl() {
        userMap = new HashMap<>();
        userMap.put("admin",new User("admin","admin","Administrator","admin@123.com"));
        userMap.put("Tom",new User("Tom","cat","tomcat","tomcat@cat.com"));
    }

    //注册方法
    @Override
    public void register(String username, String password, String password2, String name, String email) throws RegisterException {
        //根据username获取Map中的user对象
        User user = userMap.get(username);
        //username在Map中已存在
        if(user != null){
            throw new RegisterException(username+"在Map中已存在");
            //两次password不一致
        }else if ( ! password.equals(password2)) {
            throw new RegisterException("两次输入的密码不一致");
        }else {
            userMap.put("username",new User(username,password,name,email));
        }
    }
    //登录方法
    @Override
    public void login(String username, String password) throws LoginException {
        //根据username获取Map中的user对象
        User user = userMap.get(username);
        //user不存在
        if(user ==null){
            throw new LoginException(username+"不存在");
            //username 和 password 不匹配
        }
        if(!user.getPassword().equals(password)){
            throw new LoginException("用户名"+username+"和密码"+password+"不匹配" );
        }
            System.out.println("登陆成功");
    }
    //查看方法
    public void see(){
    //values是按哈希码排布,在外看来是乱序。
        System.out.println(userMap.values());
    }
}

UserView接口

/**
 * 用户界面
 */
public interface UserView {
    void register() ;
    void login() ;
}

UserViewImpl类

import java.util.Scanner;

/**
 * 用户界面实现类
 */
public class UserViewImpl implements UserView {
       UserBiz userBiz;
       Scanner sc;
    //注册
    @Override
    public void register() {
        //Scanner类
        sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        //读入用户名
        String username = sc.next();
        //读入密码
        System.out.println("请输入密码");
        String password = sc.next();
        //读入第二次密码
        System.out.println("请输入第二次密码");
        String password2 = sc.next();
        //读入用户真实姓名
        System.out.println("请输入真实姓名");
        String name = sc.next();
        //读入用户邮箱
        System.out.println("请输入真实姓名");
        String email = sc.next();
        //创建UserBizImpl对象
        userBiz = new UserBizImpl();
        try {
            userBiz.register(username,password,password2,name,email);
        } catch (RegisterException e) {
            e.printStackTrace();
        }
    }
    //登录
    @Override
    public void login()  {
        //Scanner类
        sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        //读入用户名
        String username = sc.next();
        //读入密码
        System.out.println("请输入密码");
        String password = sc.next();
        //创建UserBizImpl对象
        userBiz = new UserBizImpl();
        try {
            userBiz.login(username,password);
        } catch (LoginException e) {
            e.printStackTrace();
        }
    }

}

Test测试类

import java.util.Scanner;
/**
 * 测试类
 */
public class Test {
    public static void main(String[] args)  {
        //用户服务的对象
        UserBizImpl userBiz = new UserBizImpl();
        //用户界面的对象
        UserViewImpl userView = new UserViewImpl();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("--------------------------------------------------");
            System.out.println("请选择功能:");
            System.out.println("1:用户注册");
            System.out.println("2:用户登录");
            System.out.println("3:查看已注册的所有用户");
            System.out.println("0:退出程序");
            int choose =sc.nextInt();
            switch (choose) {
                case 1:
                    userView.register();
                    break;
                case 2:
                    userView.login();
                    break;
                case 3:
                    userBiz.see();
                    break;
                case 0:
                    System.exit(0);
                    break;
                default:
                    System.out.println("你输入的数字不正确,请重试");
            }
        }
    }
}

程序运行结果

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值