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

Java使用.txt文件实现登录功能报错:StringIndexOutOfBoundsException

问题分析与修复方案

错误根源

你碰到的java.lang.StringIndexOutOfBoundsException是因为两个核心问题:

  1. 代码直接对所有读取到的行调用substring(10),但文件里存在空行、分隔线等长度不足10的行,强行截取会触发索引越界。
  2. 用文件字节长度rf.length()做循环依据,每次i+=5的逻辑完全错误——文件长度是字节数,和行数没有对应关系,导致读取顺序完全混乱,会读到非Username/Password的行。

修复后的代码

btnLogin.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String inputUsername = txtUser.getText().trim();
        String inputPassword = txtPass.getText().trim();
        boolean loginSuccess = false;

        // 用try-with-resources自动关闭文件,避免资源泄漏
        try (RandomAccessFile rf = new RandomAccessFile("Student.txt", "r")) { 
            String line;
            String storedUsername = null;

            while ((line = rf.readLine()) != null) {
                line = line.trim();
                // 识别用户名行,提取内容
                if (line.startsWith("Username:")) {
                    storedUsername = line.substring(line.indexOf(": ") + 2).trim();
                } 
                // 识别密码行,立即比对
                else if (line.startsWith("Password:")) {
                    String storedPassword = line.substring(line.indexOf(": ") + 2).trim();
                    if (inputUsername.equals(storedUsername) && inputPassword.equals(storedPassword)) {
                        JOptionPane.showMessageDialog(null, "登录成功");
                        loginSuccess = true;
                        break;
                    }
                }
                // 其他行(姓名、学号、分隔线等)直接跳过
            }

            if (!loginSuccess) {
                JOptionPane.showMessageDialog(null, "用户名或密码错误!");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "文件读取失败:" + ex.getMessage());
        }
    }
});

核心优化点

  • 避免索引越界:不再固定截取位置,而是通过indexOf(": ")动态找到分隔符位置,提取后续内容,适配所有行的长度。
  • 正确遍历逻辑:用while循环逐行读取到文件末尾,替代原来错误的字节长度循环。
  • 高效匹配:读取到密码后立即和暂存的用户名比对,匹配成功就终止循环,无需遍历整个文件。
  • 容错处理:用trim()去除输入和文件内容的首尾空格,避免因空格导致的匹配失败;自动关闭文件防止资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:50:21