Java使用.txt文件实现登录功能报错:StringIndexOutOfBoundsException
问题分析与修复方案
错误根源
你碰到的java.lang.StringIndexOutOfBoundsException是因为两个核心问题:
- 代码直接对所有读取到的行调用
substring(10),但文件里存在空行、分隔线等长度不足10的行,强行截取会触发索引越界。 - 用文件字节长度
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
相关产品推荐
相关产品推荐

