如何解决:
// 问题1:(registe方法) 退出循环重新加载菜单会导致索引值清零,新数据覆盖旧数据,user[1]和user[2]为null
// 问题2:(login方法) if语句和else if语句从未被执行
(更新:用static定义数组的方式可以解决问题,不过我还想试试能不能在不使用static数组的情况下完成这个功能,参考大家的建议做了一些改动,结果又出现了新的问题
合并了choice和registe方法,问题1疑似解决了
问题2依旧存在
问题3:从菜单执行到login方法后会跳转去执行registe方法中的语句,可是我并没有在login方法中设置registe方法的入口,这是怎么回事呢?)
```java
public class question9 {
public static int cnt = 0;//注册次数
public static int index = 0;//数组索引
public static void main(String[] args) {
User[] user = new User[3];
registe(user);
}
public static void registe(User[] user) {
Scanner scanner = new Scanner(System.in);
System.out.println("1.注册 2.登陆 3.退出");
int choice = scanner.nextInt();
if (choice == 1) {
while (cnt != user.length) {
user[index] = new User(user);
System.out.println("用户名:");
user[index].setUsername(scanner.next());
System.out.println("密码:");
user[index].setPassword(scanner.next());
System.out.println("出生日期:");
user[index].setBirthdate(scanner.next());
System.out.println("爱好:");
user[index].setHobbies(scanner.next());
// continue;
cnt++;
index++;
registe(user);
}
//执行login方法后,无论用户名和密码如何设置,会跳转到这个位置继续执行
System.out.println("注册人数已满,禁止注册!");
registe(user);
} else if (choice == 2) {
login(user);
} else {
System.exit(0);
}
}
public static void login(User[] user) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String userlog = scanner.next();
System.out.println("请输入密码:");
String passlog = scanner.next();
// System.out.println(userlog + "..." + passlog);
//测试
//System.out.println(user[0]);//执行成功
//System.out.println(user[1]);//执行成功
//System.out.println(user[2]);//执行成功
//跳转到registe方法中choice==1 的 while循环的下面继续执行
//依旧执行失败
// 问题2:if语句和else if语句从未被执行
if (userlog.equals(user[0].getUsername()) && passlog.equals(user[0].getPassword())) {
user[0].toString();
} else if (userlog.equals(user[1].getUsername()) && passlog.equals(user[1].getPassword())) {
user[1].toString();
} else if (userlog.equals(user[2].getUsername()) && passlog.equals(user[2].getPassword())) {
user[2].toString();
} else {
System.out.println("用户名或密码错误!");// 只有本行能正常执行
}
// 测试
// String s1 = "1";
// System.out.println(s1.equals(userlog));
// System.out.println(s1.equals(user[0].getUsername()));
// System.out.println(userlog.equals(user[0].getUsername()));
// System.out.println(passlog.equals(user[0].getPassword()));
}
}
class User {
private String username;
private String password;
private String birthdate;
private String hobbies;
/**
*
*/
public User() {
super();
}
/**
* @param user
*/
public User(User[] user) {
// TODO Auto-generated constructor stub
}
/**
* @param username
* @param password
* @param birthdate
* @param hobbies
*/
public User(String username, String password, String birthdate, String hobbies) {
super();
this.username = username;
this.password = password;
this.birthdate = birthdate;
this.hobbies = hobbies;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the birthdate
*/
public String getBirthdate() {
return birthdate;
}
/**
* @param birthdate the birthdate to set
*/
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
/**
* @return the hobbies
*/
public String getHobbies() {
return hobbies;
}
/**
* @param hobbies the hobbies to set
*/
public void setHobbies(String hobbies) {
this.hobbies = hobbies;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", birthdate=" + birthdate + ", hobbies="
+ hobbies + "]";
}
}
```
package csdn20230130;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @Description
* @Author wangFei
* @Date 2023/1/30 9:36
* @Version 1.0
**/
public class question9 {
public static int cnt = 3;
static List<User> list = new ArrayList<>();
public static void main(String[] args) {
choice(list);
}
public static void choice(List<User> list) {
System.out.println("1.注册 2.登陆 3.退出");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
System.out.println(list);
if (choice == 1) {
registe(list);
} else if (choice == 2) {
login();
} else {
System.exit(0);
}
}
public static void registe(List<User> list) {
Scanner scanner = new Scanner(System.in);
User user = new User();
System.out.println("用户名:");
user.setUsername(scanner.next());
System.out.println("密码:");
user.setPassword(scanner.next());
;
System.out.println("出生日期:");
user.setBirthdate(scanner.next());
;
System.out.println("爱好:");
user.setHobbies(scanner.next());
// 问题1:退出循环重新加载菜单会导致索引值清零,新数据覆盖旧数据,user[1]和user[2]为null
if (cnt > list.size()) {
list.add(user);
choice(list);
} else {
System.out.println("注册人数已满,禁止注册!");
choice(list);
}
}
public static void login() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String userlog = scanner.next();
System.out.println("请输入密码:");
String passlog = scanner.next();
// 问题2:if语句和else if语句从未被执行
for (User u : list) {
String username = u.getUsername();
String password = u.getPassword();
if (userlog.equals(username) && passlog.equals(password)) {
System.out.println("登录成功,用户:" + u);
}
}
choice(list);
// 测试
// String s1 = "1";
// System.out.println(s1.equals(userlog));
// System.out.println(s1.equals(user[0].getUsername()));
// System.out.println(userlog.equals(user[0].getUsername()));
// System.out.println(passlog.equals(user[0].getPassword()));
}
}
class User {
private String username;
private String password;
private String birthdate;
private String hobbies;
/**
*
*/
public User() {
super();
}
/**
* @param user
*/
public User(User[] user) {
// TODO Auto-generated constructor stub
}
/**
* @param username
* @param password
* @param birthdate
* @param hobbies
*/
public User(String username, String password, String birthdate, String hobbies) {
super();
this.username = username;
this.password = password;
this.birthdate = birthdate;
this.hobbies = hobbies;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the birthdate
*/
public String getBirthdate() {
return birthdate;
}
/**
* @param birthdate the birthdate to set
*/
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
/**
* @return the hobbies
*/
public String getHobbies() {
return hobbies;
}
/**
* @param hobbies the hobbies to set
*/
public void setHobbies(String hobbies) {
this.hobbies = hobbies;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", birthdate=" + birthdate + ", hobbies="
+ hobbies + "]";
}
}
问题1.
你的代码里根本就没有循环
你所谓的退出循环其实是退出了进程
进程没了内存也就清空了
而你又没有将数据持久化(存到文件或数据库)
再重新启动它当然没了呀
问题2.
user里是你上次执行程序的时候赋值的,你关闭了程序重新执行login的时候里面是空的,当然if判断的时候不可能匹配呀
解决办法:
要么将数据库持久化,启动的时候先把保存的数据读出来,而不是每次都需要录入
要么写个循环,把choice用while包起来,执行完录入不要退出,返回前面重新选择菜单
问题一:你自个给new了,当然每次都使用的新的数据,你传入的事对象数组,理论上不需要再进行初始化操作了。
问题二:使用string类型的进行比较,但是你的输入没有限制为string类型的导致if和else if都不能被执行。