该文章为本人学习复习用
本人为Java自学新手,代码实现可能存在冗余或设计不当之处,恳请各位前辈:
1⃣ 指出代码中的不合理实现
2⃣ 推荐更优的解决方案
3⃣ 相关技术扩展建议
这个代码是我在看黑马的时候 自己看项目文档敲的 后续学了static初始化 然后我使用在了我的这个学生管理系统 不知道为什么static初始化数据没添加进去 还出现了空指针的问题,问了很多ai 建议都是在getindex方法中的if修改为:
if (useName != null && useName.equals(username)) {
//存在 意味着集合中已有该id
return i;
}
这里确实不会出现空指针问题了 但是static初始化数据依旧没添加进去, 我对照黑马写的, 感觉没什么区别啊 问ai ai给出的建议就跟没给一样 希望有大佬能解答一下
虽然出现了问题, 但是当写完这个项目再创建学生管理系统的对象并调用方法, 输出台弹出:
心里真的非常爽
public class App {
static ArrayList list = new ArrayList<>();
static {
list.add(new User("zhang", "12345", "123456789012345678", "12345678901"));
}
public static void main(String[] args) {
//定义集合
//ArrayList list = new ArrayList<>();
//登录界面:
//loop:
while (true) {
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作:");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.忘记密码");
System.out.println("4.退出");
//键盘录入操作
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case "1" -> logIn(list);
case "2" -> signIn(list);
case "3" -> forget(list);
case "4" -> {
System.out.println("退出");
//break loop;
System.exit(0);
}
default -> System.out.println("没有这个选项");
}
}
}
//忘记密码
public static void forget(ArrayList list) {
//键盘录入用户名 判断是否存在
//存在 直接修改
//不存在 提示用户未注册
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入要修改密码的用户名:");
String username = sc.next();
boolean flag = contains(list, username);
if (flag) {
//存在 可以修改密码
//此时键盘录入手机号和身份证号码
System.out.println("请输入该用户名的手机号码:");
String phoneNumber = sc.next();
System.out.println("请输入该用户名的身份证号码:");
String personId = sc.next();
//获取用户的手机和身份证
for (int i = 0; i < list.size(); i++) {
//获取集合中的数据
User u = list.get(i);
//输入忘记密码的手机号码
String phoneNumber1 = u.getPhoneNumber();
//输入忘记密码的身份证号码
String personId1 = u.getPersonId();
while (true) {
if (phoneNumber.equals(phoneNumber1) && personId.equalsIgnoreCase(personId1)) {
System.out.println("请输入你要修改后的密码:");
String newPassword = sc.next();
System.out.println("请再次输入修改后的密码");
String newPassword1 = sc.next();
u.setPassword(newPassword1);
if (newPassword.equals(newPassword1)) {
System.out.println("修改密码成功");
return;
} else {
System.out.println("两次输入密码不一致");
}
} else if (!phoneNumber.equals(phoneNumber1)) {
System.out.println("手机号码错误");
break;
} else if (!personId.equals(personId1)) {
System.out.println("身份证号码错误");
break;
} else {
System.out.println("身份证号码和手机号码都有误");
break;
}
}
}
} else {
System.out.println("该用户未注册");
break;
}
}
}
//登录
public static void logIn(ArrayList list) {
//键盘录入用户名
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入用户名:");
String username = sc.next();
//判断用户是否存在
int index = getIndex(list, username);
if (index == -1) {
//意味着集合中没有这个用户名
System.out.println("用户名: " + username + "未注册," + "请先注册再登录");
return;
}
//键盘录入密码
System.out.println("请输入密码:");
String password = sc.next();
//判断密码是否正确
boolean b = checkPassword(list, password);
if (b) {
break;
} else {
System.out.println("登录失败, 用户名或密码错误");
}
}
//获取验证码
//1.定义数组存储大小写字母和数字
char[] arr = new char[52];
//用户输入验证码
while (true) {
//调用方法 生成验证码
String result = check(arr);
//调用方法 随机位置
String latResult = lastCheck(result);
System.out.println("验证码: " + latResult);
String check = sc.next();
System.out.println("当前的验证码为:" + check);
System.out.println("请输入验证码: ");
if (check.equalsIgnoreCase(latResult)) {
System.out.println("验证码输入成功");
System.out.println("登录成功");
//创建对象调用方法启用学生管理系统
StudentSystem ss = new StudentSystem();
ss.startsStudentSystem();
break;
} else {
System.out.println("验证码错误");
}
}
}
//1.生成验证码方法
public static String check(char[] arr) {
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//小写a~z:// a:97 z:122 A:65 Z:90
if (i <= 25) {
arr[i] = (char) (i + 97);
} else {
//运行到这i已经是26了
//大写A~Z
arr[i] = (char) (i + 65 - 26);
}
}
//定义字符串存储验证码
String result = "";
//生成随机5个索引
for (int i = 0; i < 5; i++) {
int index = r.nextInt(arr.length);
//拼接字母
result = result + arr[index];
}
//生成数字
int number = r.nextInt(10);
result = result + number;
return result;
}
//2.把验证码顺序弄乱
public static String lastCheck(String result) {
Random r = new Random();
//将字符串变成字符数组
char[] charArray = result.toCharArray();
for (int i = 0; i < charArray.length; i++) {
//生成随机数
int index = r.nextInt(charArray.length - 1);
//获取数字字符
char temp = charArray[charArray.length - 1];
charArray[charArray.length - 1] = charArray[index];
charArray[index] = temp;
}
//将字符数组变回字符串
String str = new String(charArray);
return str;
}
//3.判断密码方法
public static boolean checkPassword(ArrayList list, String password) {
//遍历集合
for (int i = 0; i < list.size(); i++) {
//获取集合数据
User user = list.get(i);
//获取集合中的密码
String userPassword = user.getPassword();
//判断密码是否正确
if (userPassword.equals(password)) {
return true;
} else {
System.out.println("密码错误, 请重新输入");
return false;
}
}
return true;
}
//注册
public static void signIn(ArrayList list) {
//键盘录入注册用户名
Scanner sc = new Scanner(System.in);
System.out.println("请输入要注册的用户名:");
String inUser = sc.next();
while (true) {
//代码到这意味着用户不存在 可以注册
//要求: 1.长度3~15
if (inUser.length() < 3 || inUser.length() > 15) {
System.out.println("该用户名超出限制, 请重新输入:");
} else {
break;
}
}
//2.字母+数字
for (int i = 0; i < inUser.length(); i++) {
//获取字符串每一个字符
char c = inUser.charAt(i);
// a:97 z:122 A:65 Z:90 '0':48 '9':57
if (c < 48 || (c > 57 && c < 65) || (c > 90 && c < 97) || c > 120) {
System.out.println("该用户名不符合要求, 请重新输入");
}
//3.不能是纯数字
//定义计数器
int count = 0;
if ((c >= 97 && c <= 122) || (c >= 65 && c <= 90)) {
count++;
}
if (count <= 0) {
System.out.println("该用户名不符合要求, 请重新输入");
break;
}
//到集合中判断id是否存在
int index = getIndex(list, inUser);
if (index >= 0) {
//存在 不可以存在
System.out.println("用户名为:" + inUser + "的用户已经注册了,请重新操作");
//结束方法
break;
}
}
//输入密码
String onePassword;
String towPassword;
while (true) {
System.out.println("请输入第一次设置的密码:");
onePassword = sc.next();
System.out.println("请输入第二次设置的密码");
System.out.println("两次输入的密码必须一致");
towPassword = sc.next();
if (onePassword.equals(towPassword)) {
System.out.println("密码设置成功");
break;
} else {
System.out.println("两次输入的密码不一致, 请重新输入");
}
}
//录入身份证号码
String personId = null;
while (true) {
System.out.println("请输入要注册的身份证号码:");
personId = sc.next();
boolean b = checkPersonId(personId);
if (b) {
break;
}
}
//录入手机号
String phoneNumber = null;
while (true) {
System.out.println("请输入要注册的手机号码");
phoneNumber = sc.next();
boolean b = checkPhoneNumber(phoneNumber);
if (b) {
break;
}
}
//创建User对象
User u = new User();
u.setUsername(inUser);
u.setPassword(onePassword);
u.setPersonId(personId);
u.setPhoneNumber(phoneNumber);
//将数据加入集合中
list.add(u);
System.out.println("注册账号成功");
//检查是否注册成功
//遍历集合
printList(list);
}
//检查是否注册成功方法
public static void printList(ArrayList list) {
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
System.out.println(user.getUsername() + "," + user.getPassword() + ","
+ user.getPersonId() + "," + user.getPhoneNumber());
}
}
//1.录入手机号方法
public static boolean checkPhoneNumber(String phoneNumber) {
//长度为11
int length = phoneNumber.length();
if (length == 11) {
//不能以0开头
if (phoneNumber.charAt(0) == '0') {
System.out.println("手机号码不能以0开头");
return false;
}
} else {
System.out.println("手机号码长度输入有误");
return false;
}
//必须是数字
for (int i = 0; i < phoneNumber.length(); i++) {
char c = phoneNumber.charAt(i);
if (c < 48 || c > 57) {
System.out.println("手机号存在不是数字的特殊字符");
return false;
}
}
return true;
}
//2.录入身份证号码方法
public static boolean checkPersonId(String personId) {
while (true) {
if (personId.length() == 18) {
for (int i = 0; i < personId.length(); i++) {
//获取字符串的0字符
//这里可以使用一个方法
//boolean flag = personId.starsWith("0");
//或者if(personId.starsWith("0"))
char c = personId.charAt(0);
if (c == '0') {
System.out.println("身份证号码不能以0开头");
return false;
}
}
} else {
System.out.println("该身份证不符合长度为18");
return false;
}
break;
}
for (int i = 0; i < personId.length() - 1; i++) {
//遍历前17位
char c = personId.charAt(i);
if (c < '0' || c > '9') {
System.out.println("身份证号码规格输入错误");
return false;
}
}
char c1 = personId.charAt(personId.length() - 1);
if ((c1 > 48 && c1 < 57) || c1 == 88 || c1 == 120) {
System.out.println("身份证录入成功");
} else {
System.out.println("最后一位输入错误");
return false;
}
return true;
}
//contains方法
public static boolean contains(ArrayList list, String username) {
//true 存在
//false 不存在
return getIndex(list, username) >= 0;
}
//getIndex方法
public static int getIndex(ArrayList list, String username) {
//遍历集合得到集合的数据
for (int i = 0; i < list.size(); i++) {
//得到数据
User user = list.get(i);
//获取用户名
String useName = user.getUsername();
//判断
if (useName.equals(username)) {
//存在 意味着集合中已有该id
return i;
}
}
//不存在 可以注册
return -1;
}