You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
            }
        }
    }
}

关键改动说明

  1. 调整注册时的存储时机:

    • 先弹出输入对话框,等用户点击OK后再读取输入框内容,确保拿到用户实际输入的值
    • 使用trim()去除输入前后空格,避免空字符干扰
    • 对JPasswordField改用getPassword()方法获取字符数组再转字符串,这是更安全的做法
  2. 修复登录校验逻辑:

    • 遍历users集合,通过索引对应匹配passes里的密码,确保用户名和密码一一对应
    • 增加登录成功标记位,遍历结束后判断是否匹配成功
  3. 完善流程控制:

    • 处理用户取消注册/登录的情况,避免无限循环
    • 增加直接退出程序的分支,符合初始菜单的Exit选项逻辑
    • 调整校验顺序,先检查空输入再检查密码匹配,逻辑更合理

内容的提问来源于stack exchange,提问作者beansies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:57:49