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

Java认证方法authenticate始终返回false,请求问题排查

问题排查与解决办法

看起来你的authenticate方法始终返回false,我帮你找出了几个关键问题:

1. 构造方法跳过了第一行数据

在UserList的构造函数里,你先执行了String ligne = scan.nextLine();,然后才进入while (scan.hasNext())循环读取后续行。这会导致Login.txt的第一行数据被直接跳过,根本没有加入到loginList中。比如你文件里的Test, Password这一条永远不会被加载,自然无法通过验证。

修复方案:
删掉那行提前读取的代码,直接从循环开始读取:

public UserList() {
    Scanner scan;
    loginList = new HashSet<>(); // 加上泛型避免未经检查的转换警告
    try {
        scan = new Scanner(new File("src/boitedejeux/Logins.txt"));
        // 移除提前读取行的代码
        while (scan.hasNextLine()) { // 用hasNextLine()替代hasNext(),更准确处理行读取
            String ligne = scan.nextLine();
            String[] res = ligne.split(",");
            loginList.add(new User(res[0].trim(), res[1].trim()));
        }
    } catch (FileNotFoundException e) {
        System.out.println("Erreur");
        e.printStackTrace(); // 打印堆栈信息,方便排查文件路径等问题
    }
}

2. 字符串分割后包含多余空格

你的Login.txt里的行格式是Test, Password(逗号后面有空格),用split(",")分割后,res[1]的值是" Password"(前面带有空格)。而用户输入的密码是"Password"(没有空格),这样passw.getPassword().equals(password)肯定不相等,导致验证失败。

修复方案:
在创建User对象时,对分割后的字符串调用trim()方法去除首尾空格:

loginList.add(new User(res[0].trim(), res[1].trim()));

3. 小优化建议

  • 初始化HashSet时加上泛型:new HashSet<User>()(或者用菱形运算符new HashSet<>()),消除编译器警告。
  • 用hasNextLine()替代hasNext()判断是否还有行数据,hasNext()会按令牌分割,在特殊行格式下容易出错。
  • 异常处理里增加e.printStackTrace(),能帮你快速定位文件找不到的具体原因(比如路径拼写错误)。

验证测试

修复后,当你输入用户名Test和密码Password,或者Test2和Password2时,应该就能成功输出Hi了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:47:53