为何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
相关产品推荐
相关产品推荐

