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

注册后
登录,数组为空


```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("输入账号或密码错误");
            }
        }

    }

}


```

把注册的数量作为参数传入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

仔细调试下代码,看看具体的错误类型才好判断

在登录时,可能会出现数组为空的情况,这是因为当数组中没有任何注册用户时,程序会直接跳过验证的步骤,直接进入循环,因此会出现数组为空的情况。解决方法可以在登录时增加一个判断,如果数组为空,则提示用户先进行注册。

登录那这么改,比如你只注册了一个用户,但是你数组长度是3,那么后两个就是null,然后你输入登录的第一个用户没匹配上用户名密码,就会去看后面的用户,就空指针了。
还有你登录写的不对,如果你有两个用户,第一个没匹配上,它直接就报用户名密码错误了,你应该匹配完所有用户之后再输出

boolean check=false;
for (int i = 0; i < arr.length; i++) {
      if( arr[i]!=null){
            if (nameString.equals(arr[i].getName())&& numString.equals( arr[i].getNum())) {
                System.out.println(arr[i].getTime() + ".." + arr[i].getLike());
                check=true;
            }
        }
}
if(!check){
System.out.println("输入账号或密码错误");
}