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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:00