【问题标题】:java.lang.NumberFormatException for input string "1"输入字符串“1”的 java.lang.NumberFormatException
【发布时间】:2016-09-26 11:07:49
【问题描述】:

所以,我有一个真正困扰我的问题。我有一个用 java 制作的简单解析器。这是一段相关代码:

while( (line = br.readLine())!=null)
{
    String splitted[] = line.split(SPLITTER);
    int docNum = Integer.parseInt(splitted[0].trim());
    //do something
}

输入文件是 CSV 文件,文件的第一个条目是整数。当我开始解析时,我立即得到这个异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at dipl.parser.TableParser.parse(TableParser.java:50)
at dipl.parser.DocumentParser.main(DocumentParser.java:87)

我检查了文件,它的第一个值确实为 1(该字段中没有其他字符),但我仍然收到消息。我认为这可能是因为文件编码:它是 UTF-8,带有 Unix endlines。该程序在 Ubuntu 14.04 上运行。欢迎提出在哪里寻找问题的任何建议。

【问题讨论】:

  • 不错的一个使用复制和粘贴将错误放入问题中!

标签: java parsing encoding


【解决方案1】:

您在该号码前面有一个BOM;如果我在您的问题中复制类似于"1" 的内容并将其粘贴到vim 中,我看到您前面有一个FE FF(例如BOM)。从那个链接:

构成 BOM 的确切字节将是 Unicode 字符 U+FEFF 通过该转换格式转换成的任何内容。

这就是问题所在,使用适当的阅读器来使用文件以进行文件编码的转换(UTF-8、UTF-16 big-endian、UTF-16 little-endian 等)。有关在 Java 中读取 Unicode 文件的更多信息,另请参阅 this question and its answers。

【讨论】:

  • @Doval:谢谢,我说它是 UTF-8 BOM 是完全错误的,你说得对,在线上的 BOM UTF-8 是 EF BB BF。但我们正在查看的是读取文件然后查看错误消息中的输出的最终结果。该文件可能处于任何转换中;所有 BOM 最终都是 FE FF 一次读取。
  • 但如果它被读raw,那么……哦,我不知道。 :-) 很可能是 UTF-16。 :-) 这完全取决于文件是如何读入流中的。
  • “所有的 BOM 最终都是 FE FF 一旦读取”- 不完全是。一旦解码,所有 BOM 最终都是 U+FEFF(与 0xFE 0xFF 不同,因为它是代码点而不是字节序列)。在解码之前,你只有字节,它可以是任何可以表示 Unicode 字符的编码(主要是 UTF-8 和 UTF-16,但也有其他的)。
  • @Kevin:是的,我就是这个意思。
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多