splitData[0]为数字仍触发NumberFormatException?输入串为"1"
问题排查与解决
你遇到的这个问题看似反常——明明输入串显示是"1"却触发NumberFormatException,核心原因是这个"1"字符串里包含了肉眼不可见的非数字字符,比如全角空格、零宽空格、控制字符,甚至是看起来和半角"1"一样的全角数字"1"。
排查步骤
先加一段代码打印字符串的详细信息,揪出隐藏的异常字符:
String firstPart = splitData[0]; // 正常半角"1"的长度是1,若长度大于1则说明有隐藏字符 System.out.println("splitData[0]的长度:" + firstPart.length()); // 逐个打印字符的ASCII码,正常半角"1"的ASCII值是49 for (char c : firstPart.toCharArray()) { System.out.printf("字符:%c,ASCII码:%d%n", c, (int)c); }
如果输出长度大于1,或者ASCII码不是49,就能直接定位到异常字符的问题。
解决方法
针对隐藏字符,有两种快速处理方案:
- 先去除字符串前后的空白类字符(包括空格、制表符、换行符):
int foo = Integer.parseInt(splitData[0].trim());
- 直接过滤掉所有非数字字符(适合存在中间隐藏字符的极端场景):
int foo = Integer.parseInt(splitData[0].replaceAll("[^0-9]", ""));
另外还要留意数据来源:如果是从文件读取的内容,可能携带了UTF-8 BOM(字节顺序标记),这种不可见字符会附着在字符串开头,需要在读取文件时跳过BOM,或者通过字符串处理移除。
内容的提问来源于stack exchange,提问作者kikjoan
相关产品推荐
相关产品推荐

