Java如何将注册用户数组从主类传递到其他类并实现账户查询打印
现有代码问题汇总
- count变量逻辑错误:初始赋值为0后直接自增为1,第一个注册用户就会占用下标1的位置,下标0被浪费,且循环过程中没有对count做自增,多次注册会直接覆盖同一个下标的数据
- switch分支缺少break关键字:执行完选中的case后会继续执行后续所有case的代码,不符合预期
- Accounts类中重新实例化了Signup对象:每次
new Signup()都会生成一个全新的、属性初始化的独立实例,和主类中已经存入了用户数据的Signup实例没有关联,因此无法读取到之前存储的账户数据 - 数组打印逻辑错误:直接输出
sign.user和sign.pass会打印数组的内存地址而非数组内存储的元素,且循环仅执行2次,无法打印所有已注册的账户 - 空值判断逻辑无效:通过
scan.next()获取的密码永远不可能为null,判断pass[count]==null的分支永远不会被触发 - 不符合Java编码规范:类名应使用大驼峰命名法,main、signup、accounts这类类名首字母都需要大写
修复方案
核心解决思路是把主类中已经存入数据的Signup实例通过构造方法传递给Accounts、Login类,保证多个类操作的是同一个Signup实例,避免新建实例导致的数据丢失。
1. 修正后login包下的Signup.java
package login; public class Signup { // 固定最大注册容量 private static final int MAX_SIZE = 100; private String[] user = new String[MAX_SIZE]; private String[] pass = new String[MAX_SIZE]; // 内部维护已注册用户计数,避免外部操作计数出错 private int count = 0; // 封装新增用户的逻辑,对外屏蔽数组操作细节 public boolean addUser(String username, String password) { if (count >= MAX_SIZE) { System.out.println("注册名额已满,无法继续注册"); return false; } if (username == null || username.trim().isEmpty() || password == null || password.trim().isEmpty()) { System.out.println("用户名和密码不能为空"); return false; } user[count] = username; pass[count] = password; count++; return true; } public String[] getUsers() { return user; } public String[] getPasswords() { return pass; } public int getCount() { return count; } }
2. 修正后login包下的Accounts.java
package login; public class Accounts { private Signup signup; // 构造方法接收外部传入的、已存数据的Signup实例 public Accounts(Signup signup) { this.signup = signup; } public void accountshere() { System.out.println("Username\tPassword"); // 只遍历已注册的有效用户,不会打印空值 for(int i = 0; i < signup.getCount(); i++) { System.out.println(signup.getUsers()[i] + "\t" + signup.getPasswords()[i]); } } }
3. 修正后main包下的Main.java
package main; import login.Accounts; import login.Signup; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); boolean again = true; // 全局唯一的Signup实例,所有类都操作这个实例 Signup sign = new Signup(); while(again) { System.out.println("Enter username: "); String username = scan.next(); System.out.println("Enter password: "); String password = scan.next(); System.out.print("Sign up? [Y/N] : "); String option = scan.next(); if (option.equalsIgnoreCase("Y")) { boolean addSuccess = sign.addUser(username, password); if (addSuccess) { System.out.println("[1]Back to log-in\n[2]View Accounts"); int choose = scan.nextInt(); switch (choose) { case 1: // Login类如果需要用Signup数据,也通过构造方法传入即可 // Login newlog = new Login(sign); // newlog.loginhere(); again = false; break; // 必须加break跳出switch,避免执行后续case case 2: // 把已存数据的Signup实例传给Accounts Accounts newaccs = new Accounts(sign); newaccs.accountshere(); again = false; break; default: System.out.println("输入选项有误,请重新操作"); again = true; } } } else if (option.equalsIgnoreCase("N")) { System.out.println("取消注册,退出程序"); again = false; } else { System.out.println("输入有误,请输入Y/N"); again = true; } } scan.close(); } }
补充说明
如果需要支持多次注册功能,只需要在switch分支执行完后把again设为true即可回到注册输入流程。代码中把Signup的属性设为private、通过公共方法访问的写法是Java的封装规范,能避免外部误操作内部存储的数据。
内容的提问来源于stack exchange,提问作者helloWorld
相关产品推荐
相关产品推荐

