首行调用parseInt()抛出NumberFormatException问题排查
问题分析与解决
这种情况我碰到过好几次!十有八九是你的文件开头带了UTF-8 BOM(字节顺序标记)。
为什么会出现这个问题?
当你用Windows记事本这类工具把文件保存为UTF-8格式时,它会自动在文件最开头插入三个不可见的字节(十六进制EF BB BF),对应Unicode的U+FEFF字符。你肉眼看首行的第一个元素是1,但实际split(" ")得到的第一个字符串是"\uFEFF1"——带着这个不可见的BOM前缀,Integer.parseInt()自然无法识别,直接抛出NumberFormatException;而文件后续行没有这个前缀,所以处理完全正常。
怎么验证?
你可以在代码里加一行调试输出,看看首行第一个元素的第一个字符的Unicode值:
if ((line = reader.readLine()) != null) { String splitLine[] = line.split(" "); // 打印第一个字符的Unicode编码 System.out.println("首行第一个元素的首字符编码:" + (int) splitLine[0].charAt(0)); // 后续逻辑... }
如果输出是65279(也就是U+FEFF的十进制值),那百分百是BOM的锅。
解决办法
这里给你几个实用的方案:
- 方案一:修改文件格式
用支持编码选择的编辑器(比如VS Code、Notepad++)打开文件,重新保存为UTF-8 无BOM格式(Notepad++里叫「UTF-8 without BOM」,VS Code保存时可以在编码选项里选)。 - 方案二:代码里手动处理BOM
在读取每一行(尤其是首行)时,判断是否以BOM字符开头,如果是就去掉前缀:while ((line = reader.readLine()) != null) { // 移除开头的BOM字符 if (line.startsWith("\uFEFF")) { line = line.substring(1); } String splitLine[] = line.split(" "); int number = Integer.parseInt(splitLine[0]); // 后续逻辑... } - 方案三:指定正确的编码读取
不要用FileReader(它会使用系统默认编码),改用InputStreamReader并指定UTF-8编码,不过注意Java的标准UTF-8解码不会自动去掉BOM,所以还是结合方案二更稳妥:BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
小概率其他原因
如果验证后不是BOM的问题,那可以检查首行是否有全角空格、不可见控制字符这类隐藏内容——不过这种情况远不如BOM常见。
内容的提问来源于stack exchange,提问作者herpderp
相关产品推荐
相关产品推荐

