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

