木安` 2023-03-20 18:06 采纳率: 66.7%
浏览 24
已结题

关于#数组#的问题,如何解决?

注册后
登录,数组为空


```java

package com.beiyun.day_04;

import java.lang.reflect.GenericArrayType;
import java.util.Scanner;

/*
 * 一、    需求说明:实现用户注册、登陆功能;
1.程序中使用一个长度为3的对象数组,存储用户的登录名和密码:
例如如下格式:
    登录名    密码      生日           爱好
zhangsan    1111    1111    旅游,唱歌
lisi    2222    2002-05-20    吃饭,睡觉,打豆豆
wangwu    3333    2001-07-28    看书,看电影,旅游
注册时,要判断数组是否已满,是:则禁止注册。
2.    循环为用户列出菜单:
1.注册     2.登陆     3.退出
3.    用户选择1,调用:registe()方法,执行注册流程;
用户选择2,调用:login()方法,执行登陆流程;
用户选择3,结束程序;
4.    编写方法:registe(),执行注册流程:
    要求用户输入以下信息(信息无需校验):
            用户名:
            登录密码:
            出生日期:
            爱好:(多个爱好中间用逗号(中英文都可以)隔开)
5.    编写方法:login(),执行登陆流程:
    请用户输入登录名、登陆密码;
    使用登录名和密码进行验证;
通过:打印:这个用户的所有信息;
未通过:打印:用户名或密码错误!

 */
public class Demo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);// 创建键盘录入        
        StrDemo3[] arr = new StrDemo3[3];// 创建数组储存数据
        boolean flag = true;// 循环结束条件
        
        while (flag) {
            System.out.print("输1注册");// 功能
            System.out.print("   输2登录");
            System.out.print("   输3退出");
            int num = scanner.nextInt();// 选择功能
            switch (num) {
            case 1:// 注册
                registe(num, arr);
                break;
            case 2:// 登录
                login(num, arr);
                break;
            case 3:// 退出
                flag = false;
                break;
            default:
                System.out.println("哎呦,你干嘛!!!");
                break;
            }
        }

    }

    public static void registe(int num, StrDemo3[] arr) {// 注册

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == null) {
                Scanner scanner = new Scanner(System.in);
                System.out.println("登录名");
                String nameString = scanner.next();
                System.out.println("密码");
                int numString = scanner.nextInt();
                System.out.println("生日");
                String timeString = scanner.next();
                System.out.println("爱好");
                String likeString = scanner.next();
                StrDemo3 str = new StrDemo3(nameString, numString, timeString, likeString);
                arr[i] = str;            
                System.out.println("注册成功");
                break;
            } 
        }

    }

    public static void login(int num, StrDemo3[] arr) {// 登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("登录名");
        String nameString = scanner.next();
        System.out.println("密码");
        int numString = scanner.nextInt();
        for (int i = 0; i < arr.length; i++) {
            if (nameString == arr[i].getName() && numString == arr[i].getNum()) {
                System.out.println(arr[i].getTime() + ".." + arr[i].getLike());
            }else {
                System.out.println("输入账号或密码错误");
            }
        }

    }

}package com.beiyun.day_04;

import java.lang.reflect.GenericArrayType;
import java.util.Scanner;

/*
 * 一、    需求说明:实现用户注册、登陆功能;
1.程序中使用一个长度为3的对象数组,存储用户的登录名和密码:
例如如下格式:
    登录名    密码      生日           爱好
zhangsan    1111    1111    旅游,唱歌
lisi    2222    2002-05-20    吃饭,睡觉,打豆豆
wangwu    3333    2001-07-28    看书,看电影,旅游
注册时,要判断数组是否已满,是:则禁止注册。
2.    循环为用户列出菜单:
1.注册     2.登陆     3.退出
3.    用户选择1,调用:registe()方法,执行注册流程;
用户选择2,调用:login()方法,执行登陆流程;
用户选择3,结束程序;
4.    编写方法:registe(),执行注册流程:
    要求用户输入以下信息(信息无需校验):
            用户名:
            登录密码:
            出生日期:
            爱好:(多个爱好中间用逗号(中英文都可以)隔开)
5.    编写方法:login(),执行登陆流程:
    请用户输入登录名、登陆密码;
    使用登录名和密码进行验证;
通过:打印:这个用户的所有信息;
未通过:打印:用户名或密码错误!

 */
public class Demo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);// 创建键盘录入        
        StrDemo3[] arr = new StrDemo3[3];// 创建数组储存数据
        boolean flag = true;// 循环结束条件
        
        while (flag) {
            System.out.print("输1注册");// 功能
            System.out.print("   输2登录");
            System.out.print("   输3退出");
            int num = scanner.nextInt();// 选择功能
            switch (num) {
            case 1:// 注册
                registe(num, arr);
                break;
            case 2:// 登录
                login(num, arr);
                break;
            case 3:// 退出
                flag = false;
                break;
            default:
                System.out.println("哎呦,你干嘛!!!");
                break;
            }
        }

    }

    public static void registe(int num, StrDemo3[] arr) {// 注册

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == null) {
                Scanner scanner = new Scanner(System.in);
                System.out.println("登录名");
                String nameString = scanner.next();
                System.out.println("密码");
                int numString = scanner.nextInt();
                System.out.println("生日");
                String timeString = scanner.next();
                System.out.println("爱好");
                String likeString = scanner.next();
                StrDemo3 str = new StrDemo3(nameString, numString, timeString, likeString);
                arr[i] = str;            
                System.out.println("注册成功");
                break;
            } 
        }

    }

    public static void login(int num, StrDemo3[] arr) {// 登录
        Scanner scanner = new Scanner(System.in);
        System.out.println("登录名");
        String nameString = scanner.next();
        System.out.println("密码");
        int numString = scanner.nextInt();
        for (int i = 0; i < arr.length; i++) {
            if (nameString == arr[i].getName() && numString == arr[i].getNum()) {
                System.out.println(arr[i].getTime() + ".." + arr[i].getLike());
            }else {
                System.out.println("输入账号或密码错误");
            }
        }

    }

}


```

  • 写回答

5条回答 默认 最新

  • a5156520 2023-03-20 19:38
    关注

    把注册的数量作为参数传入login方法作为其访问用户信息数组的最大下标即可,因为如果登录时访问到未赋值的数组元素,则会报空指针异常。

    修改如下:

    参考链接:

    
     
    
     
    import java.lang.reflect.GenericArrayType;
    import java.util.Scanner;
     
    /*
     * 一、    需求说明:实现用户注册、登陆功能;
    1.程序中使用一个长度为3的对象数组,存储用户的登录名和密码:
    例如如下格式:
        登录名    密码      生日           爱好
    zhangsan    1111    1111    旅游,唱歌
    lisi    2222    2002-05-20    吃饭,睡觉,打豆豆
    wangwu    3333    2001-07-28    看书,看电影,旅游
    注册时,要判断数组是否已满,是:则禁止注册。
    2.    循环为用户列出菜单:
    1.注册     2.登陆     3.退出
    3.    用户选择1,调用:registe()方法,执行注册流程;
    用户选择2,调用:login()方法,执行登陆流程;
    用户选择3,结束程序;
    4.    编写方法:registe(),执行注册流程:
        要求用户输入以下信息(信息无需校验):
                用户名:
                登录密码:
                出生日期:
                爱好:(多个爱好中间用逗号(中英文都可以)隔开)
    5.    编写方法:login(),执行登陆流程:
        请用户输入登录名、登陆密码;
        使用登录名和密码进行验证;
    通过:打印:这个用户的所有信息;
    未通过:打印:用户名或密码错误!
     */
    
    
    
    public class Demo3 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);// 创建键盘录入        
            StrDemo3[] arr = new StrDemo3[3];// 创建数组储存数据
            boolean flag = true;// 循环结束条件
            int len=0;
            
            while (flag) {
                System.out.print("输1注册");// 功能
                System.out.print("   输2登录");
                System.out.println("   输3退出");
                int num = scanner.nextInt();// 选择功能
                switch (num) {
                case 1:// 注册
                    len=registe(len, arr);
                    break;
                case 2:// 登录
                    login(len, arr);
                    break;
                case 3:// 退出
                    flag = false;
                    break;
                default:
                    System.out.println("哎呦,你干嘛!!!");
                    break;
                }
            }
     
        }
     
        public static int registe(int num, StrDemo3[] arr) {// 注册
     
            int i;
            for (i = 0; i < arr.length; i++) {
                if (arr[i] == null) {
                    Scanner scanner = new Scanner(System.in);
                    System.out.println("登录名");
                    String nameString = scanner.next();
                    System.out.println("密码");
                    int numString = scanner.nextInt();
                    System.out.println("生日");
                    String timeString = scanner.next();
                    System.out.println("爱好");
                    String likeString = scanner.next();
                    StrDemo3 str = new StrDemo3(nameString, numString, timeString, likeString);
                    arr[i] = str;            
                    System.out.println("注册成功");
                    break;
                } 
            }
            return i;
        }
     
        public static void login(int num, StrDemo3[] arr) {// 登录
            Scanner scanner = new Scanner(System.in);
            System.out.println("登录名");
            String nameString = scanner.next();
            System.out.println("密码");
            int numString = scanner.nextInt();
            int findUser=0;// 标志是否在用户信息中找到 匹配的用户名和密码
            for (int i = 0; i <=num; i++) {  // 以传入方法的参数num作为访问用户信息数组的最大下标,防止访问到未赋值的数组元素
                if (nameString.equals(arr[i].getName()) && numString == arr[i].getNum()) {
                    System.out.println(arr[i].getTime() + ".." + arr[i].getLike());
                    findUser=1; // 标记找到
                    break;
                }
            }
            
            if (findUser==0) {  // 如果遍历整个数组已记录的所有用户信息都没找到,则打印错误提示信息
                System.out.println("输入账号或密码错误");
            }
     
        }
     
    }
     
    class StrDemo3{
    
        public String nameString;
        public int numString;
        public String timeString;
        public String likeString;
        
        
        public StrDemo3() {
            // TODO Auto-generated constructor stub
        }
        
    
        public StrDemo3(String nameString, int numString, String timeString, String likeString) {
            super();
            this.nameString = nameString;
            this.numString = numString;
            this.timeString = timeString;
            this.likeString = likeString;
        }
    
    
        public String getName() {
            return nameString;
        }
    
        public void setName(String nameString) {
            this.nameString = nameString;
        }
    
        public int getNum() {
            return numString;
        }
    
        public void setNum(int numString) {
            this.numString = numString;
        }
    
        public String getTime() {
            return timeString;
        }
    
        public void setTime(String timeString) {
            this.timeString = timeString;
        }
    
        public String getLike() {
            return likeString;
        }
    
        public void setLike(String likeString) {
            this.likeString = likeString;
        }
    
        @Override
        public String toString() {
            return "StrDemo3 [nameString=" + nameString + ", numString=" + numString + ", timeString=" + timeString
                    + ", likeString=" + likeString + "]";
        }
        
        
        
    }
     
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥15 C#字典调用时报错,有关文件加载
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出
  • ¥30 关于PHP中POST获取数据的问题
  • ¥30 微信小程序请求失败,网页能正常带锁访问
  • ¥15 Python实现hog特征图可视化
  • ¥30 德飞莱51单片机实现C4炸弹