JavaFX比对用户输入姓名与文件数据 匹配后仍弹出新窗口问题求解
问题根因分析
- 核心逻辑错误:当前代码仅会读取文件的第一行内容做比对,比对完成后无论是否匹配都会直接执行
break终止循环,完全不会读取文件后续的姓名内容。只要第一行不匹配,就会直接打开新窗口,根本不会校验后续行是否存在重复姓名,这是你遇到问题的最主要原因。 - 代码结构问题:打开新窗口的逻辑被放在了
while循环内部,不符合「全文件校验无重复再开窗口」的需求。 - 资源未释放:读取文件的
Scanner对象使用后没有关闭,存在资源泄漏风险。 - 隐性比对误差:没有处理输入内容、文件内容首尾的空格问题,可能出现内容实际一致但因为多余空格导致比对失败的情况。
修复方案
你需要先遍历完文件所有行确认没有重复姓名后,再执行打开新窗口的逻辑,调整后的代码如下:
void submitBu(ActionEvent event) { File file = new File("/Users/AL/info.txt"); String name = nameTextField.getText().trim(); // 去掉输入首尾空格,避免空格导致比对失败 boolean isNameExist = false; // 用try-with-resources自动关闭Scanner,避免资源泄漏 try (Scanner scanner = new Scanner(file)) { while (scanner.hasNextLine()) { String existName = scanner.nextLine().trim(); // 文件读取内容也去掉首尾空格 if (existName.equalsIgnoreCase(name)) { displayMessage("登录失败,请重试。", Alert.AlertType.ERROR); isNameExist = true; break; // 找到重复姓名就终止循环 } } // 全文件遍历完确认不存在重复,再打开新窗口 if (!isNameExist) { Pane root = FXMLLoader.load(getClass().getResource("/view/CreditCard.fxml")); Stage stage = new Stage(); stage.setScene(new Scene(root, 600, 400)); stage.setTitle("CreditCard"); // 修复原代码的拼写错误 stage.show(); } } catch (FileNotFoundException e) { displayMessage("用户信息文件不存在", Alert.AlertType.ERROR); e.printStackTrace(); } catch (IOException e) { displayMessage("页面加载失败", Alert.AlertType.ERROR); e.printStackTrace(); } }
额外优化建议
- 增加非空校验:提交前先判断用户输入的姓名是否为空,避免无效提交
- 路径优化:不要写死文件绝对路径,可改成读取项目资源目录文件,或通过配置文件指定路径,避免更换运行环境后路径失效
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

