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

Java解析文本文件整数时抛出NumberFormatException问题

解决Integer.parseInt()抛出NumberFormatException的问题

嘿,我来帮你搞定这个烦人的异常!这种情况我碰过好多次——看起来字符串明明是整数,但转换时偏就报错,大概率是文本里藏着你肉眼看不到的特殊字符,或者读取时带了多余的空白。下面一步步给你排查和解决:

常见原因&对应解决方法

1. 文本开头的UTF-8 BOM字符

很多编辑器保存UTF-8文件时会自动加上BOM(\uFEFF),这个字符完全看不见,但它会让"1125"变成"\uFEFF1125",转整数自然就失败了。

解决方式:读取后先移除BOM字符:

String cleanedLine = line.replaceFirst("^\\uFEFF", "");

2. 首尾的空白字符(换行、空格、制表符)

读取行时可能会带上\n、\r或者首尾空格,比如字符串实际是" 1125 "或者"1125\n",这些都会导致转换失败。

解决方式:用trim()去掉首尾所有空白:

String cleanedLine = line.trim();

3. 文件编码不匹配导致的乱码

如果文件实际编码和读取时用的编码不一致,可能会出现看起来正常但实际是乱码的情况,比如GBK文件用UTF-8读取,字符会悄悄变形。

解决方式:指定正确的编码读取文件,比如UTF-8:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream("你的文件.txt"), StandardCharsets.UTF_8)
);

改进后的完整示例代码

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class FileParser {
    public static void main(String[] args) {
        List<String> lines = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 先移除BOM,再去掉首尾空白
                String cleanedLine = line.replaceFirst("^\\uFEFF", "").trim();
                lines.add(cleanedLine);
            }

            // 转换前先验证并排查问题
            if (!lines.isEmpty()) {
                String firstLine = lines.get(0);
                System.out.println("处理后的字符串:'" + firstLine + "'");

                // 验证是否是有效整数格式
                if (firstLine.matches("-?\\d+")) {
                    int num = Integer.parseInt(firstLine);
                    System.out.println("转换成功:" + num);
                } else {
                    // 打印每个字符的ASCII码,精准定位问题字符
                    System.out.println("字符详细信息:");
                    for (char c : firstLine.toCharArray()) {
                        System.out.printf("字符:%c,ASCII值:%d%n", c, (int) c);
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
}

实用排查小技巧

  • 先打印原始字符串的内容(用单引号包裹):System.out.println("原始行:'" + line + "'");,这样能直观看到有没有隐藏的空白或特殊字符。
  • 如果还是找不到问题,打印每个字符的ASCII码,像上面代码里那样,就能精准定位是哪个字符在搞鬼。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:06:02