当前位置: 首页 > news >正文

Java 控制台用户登录系统(支持角色权限与自定义异常处理)

题目

1、现在有一个文件users.txt,该文件中保存了用户的基本信息

zhangsan : 123456 : admin
lisi : 123456:hr
wangwu : 123456 : emp
zhaoliu : 123456 : manager

2、要求编写一个程序,模拟用户登录的效果。从键盘中输入用户名和密码的数据。如果数据在users.txt就表示登录成功。并展示每个角色

【基本功能】
【可以创建一个自定义异常,该异常表示用户名密码错误】
【可以创建一个自定义异常,该异常表示用户名不存在】

3、对于角色可以使用枚举进行定义。
超级管理员:可以操作所有功能。
hr:招聘、开除、协调各个部门的员工。
emp(普通员工):只能操作自己本部门的一些数据。
manager:管理本部分的所有员工。

实现

项目结构

UserLoginSystem/
├── src/
│   └── com/example/
│       ├── Main.java
│       ├── User.java
│       ├── Role.java
│       ├── AuthService.java
│       ├── exception/
│       │   ├── UserNotFoundException.java
│       │   └── PasswordErrorException.java
├── user.txt

代码

users.txt (放在项目根目录)

zhangsan : 123456 : admin
lisi : 123456 : hr
wangwu : 123456 : emp
zhaoliu : 123456 : manager

Role.java(使用枚举定义角色功能) 

package com.example;public enum Role {admin("超级管理员: 可以操作所有功能"),hr("HR: 招聘、开除、协调各个部门的员工"),emp("普通员工: 只能操作自己本部门的一些数据"),manager("经理: 管理本部分的所有员工");private final String description;Role(String description) {this.description = description;}public String getDescription() {return description;}
}

 User.java(用户对象)

package com.example;public class User {private String username;private String password;private Role role;public User(String username, String password, Role role) {this.username = username;this.password = password;this.role = role;}public String getUsername() { return username; }public String getPassword() { return password; }public Role getRole() { return role; }
}

UserNotFoundException.java (自定义异常类)

package com.example.exception;public class UserNotFoundException extends Exception {public UserNotFoundException(String message) {super(message);}
}

 PasswordErrorException.java(同上)

package com.example.exception;public class PasswordErrorException extends Exception {public PasswordErrorException(String message) {super(message);}
}

 AuthService.java(登录验证服务)

package com.example;import com.example.exception.*;import java.io.*;
import java.util.*;public class AuthService {private static final String USER_FILE = "users.txt";private Map<String, User> userMap = new HashMap<>();public AuthService() throws IOException {loadUsers();}private void loadUsers() throws IOException {BufferedReader reader = new BufferedReader(new FileReader(USER_FILE));String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(":");if (parts.length == 3) {String username = parts[0].trim();String password = parts[1].trim();String roleStr = parts[2].trim();Role role = Role.valueOf(roleStr);userMap.put(username, new User(username, password, role));}}reader.close();}public User login(String username, String password)throws UserNotFoundException, PasswordErrorException {if (!userMap.containsKey(username)) {throw new UserNotFoundException("用户不存在!");}User user = userMap.get(username);if (!user.getPassword().equals(password)) {throw new PasswordErrorException("密码错误!");}return user;}
}

Main.java(主函数:用户输入 → 登录 → 权限展示) 

package com.example;import com.example.exception.*;import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {AuthService authService = new AuthService();System.out.print("请输入用户名:");String username = scanner.nextLine();System.out.print("请输入密码:");String password = scanner.nextLine();User user = authService.login(username, password);System.out.println("登录成功,欢迎您:" + user.getUsername());System.out.println("您的权限描述是:" + user.getRole().getDescription());} catch (UserNotFoundException | PasswordErrorException e) {System.out.println("登录失败:" + e.getMessage());} catch (IOException e) {System.out.println("读取用户数据失败:" + e.getMessage());} finally {scanner.close();}}
}

运行结果

知识点

  一、文件读写(IO 流)

使用 BufferedReader + FileReader 读取 users.txt 文件内容。

掌握读取本地文件的方法:readLine() + split() 拆分用户信息。

使用 close() 释放资源,或可升级为 try-with-resources

相关类/方法:

BufferedReader reader = new BufferedReader(new FileReader("users.txt")); String line = reader.readLine(); reader.close();

 二、字符串处理

使用 String.split(":") 分割字符串。

使用 trim() 清除多余空格,避免解析错误。

熟练处理用户输入与文件读取内容的对比逻辑。

三、集合(Map)

使用 HashMap<String, User> 存储用户名与对应的 User 对象,实现快速查找。

体现了数据结构在登录校验中的实际应用。

 示例: 

Map<String, User> userMap = new HashMap<>(); userMap.put("zhangsan", userObj);

四、枚举(enum

使用枚举 Role 表示用户角色,并封装每种角色的功能描述。

提高代码可读性与可维护性,替代了硬编码字符串。

 示例:

public enum Role { admin("超级管理员"), emp("普通员工") // ... }

 五、面向对象设计(OOP)

使用 User 类封装用户信息(用户名、密码、角色)。

使用 AuthService 类封装登录逻辑,实现模块化设计。

使用封装(private 成员 + public getter)、构造方法、对象之间的组合。

 六、自定义异常类(Exception Handling)

UserNotFoundException:表示用户不存在。

PasswordErrorException:表示密码错误。

login() 中抛出自定义异常,在 main() 中用 try-catch 捕获并处理。

示例:

throw new UserNotFoundException("用户不存在!"); catch (UserNotFoundException e) { ... }

七、控制台交互(Scanner)

使用 Scanner 获取用户输入的用户名与密码。

 示例:

Scanner scanner = new Scanner(System.in); String username = scanner.nextLine();

http://www.lryc.cn/news/604875.html

相关文章:

  • python之asyncio协程和异步编程
  • 【MySQL学习|黑马笔记|Day3】多表查询(多表关系、内连接、外连接、自连接、联合查询、子查询),事务(简介、操作、四大体系、并发事务问题、事务隔离级别)
  • 自动化与配置管理工具 ——Ansible
  • 创建型设计模式-Builder
  • Newman+Jenkins实施接口自动化测试
  • 浏览器pdf、image显示
  • 防火墙与入侵检测
  • Linux下C/C++服务端崩溃排查手册
  • VMware16安装Ubuntu-22.04.X版本(并使用桥接模式实现局域网下使用ssh远程操作Ubuntu系统)
  • Linux 进程管理与计划任务设置
  • 16-C语言:第17天笔记
  • UnityHub Validation Failed下载编辑器错误,添加模块报错的解决方案
  • 外网访问文档编辑器Docsify(Windows版本),内网穿透技术应用简便方法
  • 论文阅读|ArxiV 2024|Mamba进一步研究|VSSD
  • Linux虚拟内存
  • Vision Transformer (ViT) 详解:当Transformer“看见”世界,计算机视觉的范式革命
  • LeetCode 160:相交链表
  • 【推荐100个unity插件】Unity 创意编程库——Klak插件的使用
  • 数据驱动的自动驾驶虚拟测试方法
  • Qt 嵌入式设备驱动开发
  • 5种安全方法:如何删除三星手机上的所有内容
  • 【同济大学】双速率自动驾驶架构LeAD:端到端+LLM,CARLA实测93%路线完成率,性能SOTA!
  • 谈谈毕业工作一年后的变化
  • 虚幻基础:模型碰撞体
  • Javascript 基础总结
  • # C语言:20250730学习(二级指针)
  • C语言实战:字符串动态展开效果
  • 酵母文库:基因功能研究的核心工具
  • BWCTAKC11X64G佰维/BIWIN存储容量为64GB
  • 魔塔社区上文生图大模型对比