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

首行调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:14:01