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

为何Java代码抛出NumberFormatException?输入字符串"1001"是数字

问题排查与解决思路

兄弟,这个NumberFormatException看起来有点诡异,但其实大概率是这两个常见原因导致的,咱们一步步来排查:

1. 先检查字符串分割逻辑是否出错

从你的代码片段和文本内容来看,你应该是想把每行的三个字段拆分出来后,把第一个字段"1001"转成整数对吧?如果这一步没做好——比如直接把整行字符串"1001 elma 87"传给Integer.parseInt(),或者用了错误的分割方式(比如只按单个空格分割,但文本里有多个空格/制表符),就会拿到包含非数字的子串,自然报错。

正确的分割方式应该用正则匹配任意空白字符,确保不管是单个空格、多个空格还是制表符都能拆分干净:

String[] parts = bilgiler.split("\\s+"); // 用\\s+匹配任意数量的空白字符
int foodId = Integer.parseInt(parts[0]); // 这时候parts[0]就是纯"1001"了

2. 排查文本文件的隐藏特殊字符

有时候文本里的"1001"看起来正常,但其实带有看不见的特殊字符——比如全角空格、BOM头(UTF-8文件可能带)、非打印ASCII字符。你可以先把读取到的字符串打印出来,看看实际内容:

System.out.println("读取到的行内容:[" + bilgiler + "]");
System.out.println("第一个字符的ASCII码:" + (int)bilgiler.charAt(0));

正常的数字"1"的ASCII码是49,如果输出的不是这个,说明有隐藏字符。这种情况可以用正则先清理掉非数字内容:

String cleanId = parts[0].replaceAll("[^0-9]", "");
int foodId = Integer.parseInt(cleanId);

完整的修正示例代码

给你补全了更健壮的读取逻辑,避免踩坑:

public class Food {
    public String[][] foodArray = new String[1000][3]; // 每行3个字段,不用设100列这么大
    public int sayac = 0;

    public void readText() {
        try (Scanner sc = new Scanner(new BufferedReader(new FileReader("food.txt")))) {
            while (sc.hasNextLine()) {
                String bilgiler = sc.nextLine().trim();
                if (bilgiler.isEmpty()) continue; // 跳过空行
                
                String[] parts = bilgiler.split("\\s+");
                if (parts.length >= 3) { // 确保字段数量足够
                    foodArray[sayac][0] = parts[0];
                    foodArray[sayac][1] = parts[1];
                    foodArray[sayac][2] = parts[2];
                    
                    // 测试解析是否正常
                    try {
                        int id = Integer.parseInt(parts[0]);
                        System.out.println("成功解析ID:" + id);
                    } catch (NumberFormatException e) {
                        System.err.println("解析失败的字符串:[" + parts[0] + "]");
                        e.printStackTrace();
                    }
                    sayac++;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

你可以先运行这段测试代码,看看控制台输出的解析失败字符串是什么,就能精准定位问题啦!

内容的提问来源于stack exchange,提问作者Mert Yanık

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:25