【问题标题】:NumberFormatException thrown on a correct String?NumberFormatException 在正确的字符串上抛出?
【发布时间】:2017-05-14 14:09:30
【问题描述】:

我正在尝试将文件解析为地图。我试图解析的文本(由 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)

我看不出这是不可解析的原因。

【问题讨论】:

  • 也许字符串中有一些不可见的特殊字符?如果你先去掉所有非数字怎么办,试试int id = Integer.parseInt(parts.get(0).replaceAll("\\D+", ""));
  • 可能是字符编码问题。

标签: java parsing integer numberformatexception


【解决方案1】:

你可以替换下面的行

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

有了这个并检查一次

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

并且告诉同样的异常再次出现。

【讨论】:

    【解决方案2】:

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

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

    以下问题解释这个问题Reading strange unicode character in Java?

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

    【讨论】:

    • 关于您的最后一点,我将其更改为parts = new ArrayList&lt;&gt;(Arrays.asList(s.split("\t"));,因此删除元素应该不是问题。
    【解决方案3】:

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

    以非编程方式,您可以使用 Notepad++ 的 在没有 BOM 的情况下以 UTF-8 编码 特征并保存输入文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 2012-02-01
      • 2012-07-07
      • 2013-03-29
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多