注册后
登录,数组为空
```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 + "]";
}
}
仔细调试下代码,看看具体的错误类型才好判断
在登录时,可能会出现数组为空的情况,这是因为当数组中没有任何注册用户时,程序会直接跳过验证的步骤,直接进入循环,因此会出现数组为空的情况。解决方法可以在登录时增加一个判断,如果数组为空,则提示用户先进行注册。
登录那这么改,比如你只注册了一个用户,但是你数组长度是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("输入账号或密码错误");
}