登录功能Scanner无法读取文件多行内容,仅识别首组账号密码求助
解决Scanner读取多组用户登录信息的问题
我看了你的代码,问题很明显——你的循环逻辑根本没机会去检查users.txt里的第二组及以后的用户!
先说说原代码的问题:
- 你用全局的
lineNo累加所有行号,第一组是行1和行2,但第二组应该是行3和行4,你的逻辑里lineNo ==1和lineNo==2只会匹配第一组 - 只要第一组的用户名不匹配,或者用户名匹配但密码不匹配,你直接
break跳出循环了,后面的用户数据连读都没读
要解决这个问题,我们应该把每两行当成一组用户信息(用户名+密码),循环读取每一组来验证,而不是按全局行号判断。下面是修正后的代码:
btLogin.setOnAction(e -> { boolean grantAccess = false; String userName = tfUsername.getText(); String password = tfPassword.getText(); File f = new File("users.txt"); try { Scanner read = new Scanner(f); // 每次循环读取一组用户(用户名+密码) while (read.hasNextLine()) { // 先读取当前组的用户名 String storedUsername = read.nextLine(); // 检查是否还有对应的密码行,避免文件格式错误导致异常 if (!read.hasNextLine()) { break; } String storedPassword = read.nextLine(); // 对比输入和当前组的信息 if (storedUsername.equals(userName) && storedPassword.equals(password)) { grantAccess = true; break; // 匹配成功,跳出循环 } // 不匹配的话,继续读取下一组 } // 这里可以加验证后的逻辑,比如跳转页面或提示信息 if (grantAccess) { System.out.println("登录成功!"); } else { System.out.println("用户名或密码错误"); } read.close(); // 记得关闭Scanner } catch (FileNotFoundException ex) { ex.printStackTrace(); System.out.println("用户文件不存在!"); } });
修正后的逻辑说明:
- 每次循环先读一行作为用户名,再读一行作为密码,这样天然对应一组用户
- 增加了
read.hasNextLine()的判断,防止文件最后一行只有用户名没有密码,导致抛出NoSuchElementException - 只有当找到匹配的用户组时才跳出循环,否则会一直读取到文件末尾
- 最后记得关闭Scanner,避免资源泄漏
这样修改后,不管users.txt里有多少组用户信息,都会逐一验证,直到找到匹配的或者读完所有内容。
内容的提问来源于stack exchange,提问作者jells08
相关产品推荐
相关产品推荐

