如何在while/for循环中正确捕获变量并存入ArrayList?
解决ArrayList存储用户注册信息及登录校验问题
核心问题分析
你代码里的两个关键错误导致数据没存入ArrayList且登录校验失败:
- 注册阶段提前读取了输入框的空值,还没等用户输入就把空字符串加入了集合
- 登录阶段错误地将单个输入字符串与整个ArrayList对象做比较,逻辑完全错误
修正后的完整代码
import javax.swing.*; import java.util.ArrayList; public class Main { public static void main(String[] args) { ImageIcon icon = new ImageIcon("cutepig.jpg"); String[] response1 = {"Sign up", "Log in", "Exit"}; int options01 = JOptionPane.showOptionDialog(null, "Welcome to Beanie's Bank!", "Beanie's Bank", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, icon, response1, 0); ArrayList<String> users = new ArrayList<>(); ArrayList<String> passes = new ArrayList<>(); // 注册逻辑 while (true) { if (options01 == 0) { JTextField username = new JTextField(); JPasswordField password = new JPasswordField(); JPasswordField confpass = new JPasswordField(); Object[] message = { "Username: ", username, "Password: ", password, "Confirm Password: ", confpass, }; int signup1 = JOptionPane.showConfirmDialog(null, message, "Sign up", JOptionPane.OK_CANCEL_OPTION); // 用户点击OK后再处理输入 if (signup1 == JOptionPane.OK_OPTION) { String inputUser = username.getText().trim(); String inputPass = new String(password.getPassword()).trim(); String inputConfPass = new String(confpass.getPassword()).trim(); // 先校验输入合法性 if (inputUser.isEmpty() || inputPass.isEmpty() || inputConfPass.isEmpty()) { JOptionPane.showMessageDialog(null, "Input cannot be empty, please enter a valid input."); continue; } else if (!inputPass.equals(inputConfPass)) { JOptionPane.showMessageDialog(null, "Your passwords do not match! Please try again."); continue; } else { // 校验通过后再存入集合 users.add(inputUser); passes.add(inputPass); JOptionPane.showMessageDialog(null, "Sign up was successful! \n Welcome to Beansie's Bank. \n Please log in to access your account!"); break; } } else { // 用户取消注册,退出循环 JOptionPane.showMessageDialog(null, "Sign up canceled."); break; } } else if (options01 == 2) { // 用户选择退出程序 JOptionPane.showMessageDialog(null, "Goodbye!"); System.exit(0); } else { // 用户选择直接登录,跳过注册循环 break; } } // 登录逻辑 while(true) { JTextField username = new JTextField(); JPasswordField password = new JPasswordField(); Object[] message = { "Username: ", username, "Password: ", password }; int option = JOptionPane.showConfirmDialog(null, message, "Login", JOptionPane.OK_CANCEL_OPTION); if (option == JOptionPane.OK_OPTION) { String inputUser = username.getText().trim(); String inputPass = new String(password.getPassword()).trim(); boolean loginSuccess = false; // 遍历集合校验用户名和密码是否匹配 for (int i = 0; i < users.size(); i++) { if (users.get(i).equals(inputUser) && passes.get(i).equals(inputPass)) { JOptionPane.showMessageDialog(null, "Login successful, welcome back " + inputUser + "."); loginSuccess = true; break; } } if (!loginSuccess) { JOptionPane.showMessageDialog(null,"Login failed, please try again."); } else { break; } } else { JOptionPane.showMessageDialog(null, "Login canceled"); continue; } } } }
关键改动说明
调整注册时的存储时机:
- 先弹出输入对话框,等用户点击OK后再读取输入框内容,确保拿到用户实际输入的值
- 使用
trim()去除输入前后空格,避免空字符干扰 - 对
JPasswordField改用getPassword()方法获取字符数组再转字符串,这是更安全的做法
修复登录校验逻辑:
- 遍历
users集合,通过索引对应匹配passes里的密码,确保用户名和密码一一对应 - 增加登录成功标记位,遍历结束后判断是否匹配成功
- 遍历
完善流程控制:
- 处理用户取消注册/登录的情况,避免无限循环
- 增加直接退出程序的分支,符合初始菜单的Exit选项逻辑
- 调整校验顺序,先检查空输入再检查密码匹配,逻辑更合理
内容的提问来源于stack exchange,提问作者beansies
相关产品推荐
相关产品推荐

