java-练习-学生管理系统

 该文章为本人学习复习用
 本人为Java自学新手,代码实现可能存在冗余或设计不当之处,恳请各位前辈:
1⃣ 指出代码中的不合理实现
2⃣ 推荐更优的解决方案
3⃣ 相关技术扩展建议

这个代码是我在看黑马的时候 自己看项目文档敲的 后续学了static初始化 然后我使用在了我的这个学生管理系统 不知道为什么static初始化数据没添加进去 还出现了空指针的问题,问了很多ai 建议都是在getindex方法中的if修改为:

if (useName != null && useName.equals(username)) {
                //存在 意味着集合中已有该id
                return i;
            }

这里确实不会出现空指针问题了 但是static初始化数据依旧没添加进去, 我对照黑马写的, 感觉没什么区别啊 问ai ai给出的建议就跟没给一样 希望有大佬能解答一下

虽然出现了问题, 但是当写完这个项目再创建学生管理系统的对象并调用方法, 输出台弹出:

java-练习-学生管理系统_第1张图片

心里真的非常爽 

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;
    }

 

你可能感兴趣的:(Java,java,开发语言)