在正确的String上抛出NumberFormatException?

时间:2017-05-14 14:09:30

标签: java parsing integer numberformatexception

我试图将文件解析为Map。我试图解析的文本(由日志中的sys out显示)是

10 przysuń hotel o 90 metrów。每个单词用\t

分隔

该文件采用UTF-8编码。

这是我的方法:

 private void readFile() {
    try {
        if (transcriptFile == null)
            transcriptFile = new File(transcriptPath);

        lines = Files.readAllLines(transcriptFile.toPath());
        for (String s : lines) {
            if (!s.isEmpty()) {
                List<String> parts = Arrays.asList(s.split("\t"));
                System.out.println(parts);

                int id = Integer.parseInt(parts.get(0).trim());
                parts.remove(0);
                String text = String.join(" ",parts);
                map.put(id,text);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我得到了这个例外:

[10, przysuń, hotel, o, 90, metrów ]
java.lang.NumberFormatException: For input string: "10"
at 
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at Controller.readFile(Controller.java:143)
at Controller.access$000(Controller.java:29)
at Controller$SpeechTask.call(Controller.java:202)
at Controller$SpeechTask.call(Controller.java:154)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:748)

我认为没有理由不解析这个问题。

3 个答案:

答案 0 :(得分:0)

您的输入文件可能包含Byte Order Mark (BOM),这是一个不可见的字符,可以位于字符10之前。尝试this post或Apache BOMInputStream

的解决方案

非编程方式,您可以使用Notepad ++的在没有BOM的UTF-8中编码 功能并保存输入文件。

答案 1 :(得分:0)

可以替换以下行

List<String> parts = Arrays.asList(s.split("\t"));

使用此功能并检查一次

List<String> parts = Arrays.asList(s.replaceAll("\\s+", ",").split(","));

告诉同样的异常再来一次。

答案 2 :(得分:0)

似乎这是因为字符编码问题,当将编码定义为UTF-8时,记事本在文件前面保存了一些额外的字符。

当我尝试此操作时,parts.get(0).trim()返回?10而不是10,因此有一个NumberFormatException。假设您已将10定义为第二个单词,那么parts.get(1).trim()将返回10并且不会有NumberFormatException

以下问题解释了此问题Reading strange unicode character in Java?

进一步Arrays.asList会返回无法修改的列表,因此即使UnsupportedOperationException成功,parts.remove(0)中也可能有Integer.parseInt