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
相关产品推荐
相关产品推荐

