Java读取文本文件时遭遇StringIndexOutOfBoundsException异常求助
问题分析与解决方案
我来帮你拆解下这个问题——核心矛盾就是你预设每行固定75字符,但实际文件里的行只有68字符,导致字符串截取时触发了越界异常。下面一步步给你解决思路:
1. 先解决眼前的报错问题
如果只是想先让代码不崩溃,可以先给每行加个长度校验,避免硬截取超出范围:
else { // 先检查行长度是否满足截取要求,不满足就跳过或打日志 if (uneLigne.length() < 74) { System.err.println("警告:行长度不足,跳过该行:" + uneLigne + "(长度:" + uneLigne.length() + ")"); continue; } nations[n] = new Nation( uneLigne.charAt(0), uneLigne.substring(55,63), uneLigne.substring(64,74), uneLigne.substring(1,15), uneLigne.substring(36,54) ); n++; }
2. 从根源解决:放弃固定位置截取,改用字段分割
你现在用固定字符位置截取的方式太脆弱了——只要文件里字段间的空格数和你预期的不一样,就会出错。更稳健的方式是按空格分隔字段来解析,因为你的数据是用大量空格分隔的,刚好可以用正则\\s+匹配一个或多个空格:
else { // 按一个或多个空格拆分每行内容 String[] fields = uneLigne.split("\\s+"); // 校验字段数量是否符合预期 if (fields.length != 4) { System.err.println("行格式错误,跳过该行:" + uneLigne); continue; } // 解析各个字段:第一个字段的首字符是大陆代码,其余部分是国家名 char codeContinent = fields[0].charAt(0); String nom = fields[0].substring(1); String capitale = fields[1]; String superficie = fields[2]; String population = fields[3]; nations[n] = new Nation(codeContinent, superficie, population, nom, capitale); n++; }
这种方式不管字段间有多少空格,都能正确拆分,完全不依赖固定字符位置,鲁棒性强很多。
3. 额外优化建议
- 检查真实文件内容:用文本编辑器打开文件,显示所有隐藏字符(比如Notepad++的「显示所有字符」功能),看看是不是有换行符格式问题(Windows的CRLF vs Linux的LF),或者某些行真的缺少了空格。
- 用try-with-resources自动关闭流:避免手动关闭流可能导致的资源泄漏,代码更简洁安全:
static int lireRemplir (String nomFichier, Nation[] nations) throws IOException { int n = 0; try (BufferedReader entree = new BufferedReader(new FileReader(nomFichier))) { String uneLigne; while ((uneLigne = entree.readLine()) != null) { // 这里放上面的行处理逻辑 } } catch (java.io.FileNotFoundException erreur) { System.out.println("Probléme avec l'ouverture du fichier " + nomFichier); } return n; }
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

