解析整数时出现NumberFormatException错误

6

我正在制作一个文件读写器,可以访问指定的文件并保存/读取它。在读取文件时遇到了问题。文件内容包含由“|”分隔符分隔的整数、字符串和双精度浮点数。我使用StringTokenizer来分离token并将它们保存到每个单独的变量中,但是当我读取整数时,即使字符串仅包含int,也会出现NumberFormatException。

这里是代码:

FileReader fr = new FileReader(filename);
BufferedReader buff = new BufferedReader(fr);
String line;

while ((line = buff.readLine()) != null) {
    StringTokenizer st = new StringTokenizer(line, "|");
    while (st.hasMoreElements()) {
         int Id = Integer.parseInt(st.nextToken());
         String Name = st.nextToken();
         double cordX = Double.parseDouble(st.nextToken());
         double cordY = Double.parseDouble(st.nextToken());
    }
}

文件中的一行示例:
8502113|Aarau|47.391355|8.051251

而错误是:
java.lang.NumberFormatException: For input string: "8502113"
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 storage.FileUtilities.readCitiesFromFile(FileUtilities.java:63)
at basics.Test.main(Test.java:16)

我是否遗漏了什么?StringTokenizer 是否以我不知道的某种方式篡改了字符串?

编辑:以下是创建文件的代码:

FileWriter fw = new FileWriter(filename, !overwrite); // For FileWriter true = append, false = overwrite, so we flip the value.
    BufferedWriter buff = new BufferedWriter(fw);
    String coordConvertor;

    for (int i = 0; i <= cities.size() - 1; i++) {
        buff.write(Integer.toString(cities.get(i).getId()));
        buff.write("|");
        buff.write(cities.get(i).getName());
        buff.write("|");
        coordConvertor = Double.toString(cities.get(i).getCoord().getX());
        buff.write(coordConvertor);
        buff.write("|");
        coordConvertor = Double.toString(cities.get(i).getCoord().getY());
        buff.write(coordConvertor);
        buff.newLine();

1
我无法重现你的问题。也许你的文件包含一些不可见字符(比如通常放在文件开头的BOM标记)。将该部分作为字符串读取,并且在解析之前打印它的length(),以查看字符数量是否与你所看到的相符。 - Pshemo
"8502113" 包含 U+FEFF Unicode 字符。 - Madhawa Priyashantha
@Pshemo 您说得对。长度似乎多了一个字符。我该怎么解决呢?有没有办法修剪文件开头的额外字符?编辑:该文件是标准的 .txt 文件。 - Akaitenshi
通常的解决方案是一开始就不要在文件中放置那个标记。你是如何创建那个文件的? - Pshemo
@YassinHajaj 如果你从上面的错误中复制“8502113”并将其分配给一个整数,你就可以重现它。例如:http://ideone.com/y3vy2T - Madhawa Priyashantha
显示剩余3条评论
1个回答

3

使用以下代码而不是 st.nextToken() 来删除您检索到的 String 中的隐藏Unicode字符

int Id = Integer.parseInt(st.nextToken().replaceAll("\\p{C}", ""));
String Name = st.nextToken().replaceAll("\\p{C}", "");
double cordX = Double.parseDouble(st.nextToken().replaceAll("\\p{C}", ""));
double cordY = Double.parseDouble(st.nextToken().replaceAll("\\p{C}", ""));

这似乎已经解决了问题,但我不明白这些 Unicode 字符是从哪里来的?另外,你能解释一下 replaceAll 中的表达式具体是做什么的吗? - Akaitenshi
我刚从如何在Java中替换不可打印的Unicode字符中获取了该解决方案。 - tfosra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接