【问题标题】:String to int with BufferedReader使用 BufferedReader 将字符串转换为 int
【发布时间】:2017-08-09 01:57:34
【问题描述】:

我有这段代码,但是当我尝试运行它时,我得到了这个错误 Exception in thread "main" java.lang.NumberFormatException: For input string: "1" 每行包含一个数字、姓名、电子邮件和日期,因此每行中的第一个字符是数字。 tomb[0] 只是一个数字

List<Szemely> lista = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(this.szemelyekcsv))) {
            String line;

            while ((line = br.readLine()) != null) {
                String[] tomb;
                tomb = line.split(";");

               int sor = Integer.parseInt(tomb [0]);
                DateTimeFormatter sima = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                LocalDate szul = LocalDate.parse(tomb[3], sima);


                lista.add(new Szemely(sor, tomb[1], tomb[2], szul));

            }
        } catch (FileNotFoundException ex) {
            System.out.println("Nem tudom megnyitni a 'be.txt' fájlt.");
        } catch (IOException ex) {
            System.out.println("Hiba a 'be.txt' fájl olvasása közben.");
        }

当程序到达这一行时

int sor = Integer.parseInt(tomb [0]);

自动跳回

try (BufferedReader br = new BufferedReader(new FileReader(this.szemelyekcsv))) 

和错误... 谢谢大家的帮助。

【问题讨论】:

  • 什么是 tomb[0] .. . 尝试先打印出来...
  • 你能提供一个minimal reproducible example吗?奇怪的是异常给出了字符串"1",因为这应该是可解析的。例如,您可能不需要File,一个String 就足够了,在发布之前尝试一下是否可以重现
  • @SantiBailors 似乎它们是用“;”分隔的然后他把它们分成墓阵列。
  • @AxelH 是否有可能是文件保存格式引起的问题?我的意思是有可能在他保存文件的格式中,我们有字符“1”,对于编译器来说不是“1”?我希望你明白我的意思。
  • 尝试打印tomb[0].length()。我怀疑字符串中有一个非打印字符。例如,它可能是"\ufeff1"

标签: java string bufferedreader text-parsing


【解决方案1】:

正如pooyanAxelHVGR 指出的问题确实是一个或多个不可见字符(例如控制字符)。

解决这个问题的一种方法是使用正则表达式删除所有不是数字的内容:

int sor = Integer.parseInt(tomb[0].replaceAll("[^0-9]+", ""));

[^...] = 不是那些字符

[0-9] = 数字

+ = 一次或多次

【讨论】:

  • 或者只对输入字符串执行 trim() 可能就足够了,并且在某种程度上更安全​​,因为您仍然会检测到错误的输入。
猜你喜欢
  • 2013-05-17
  • 2011-05-20
  • 2015-12-16
  • 1970-01-01
  • 2013-09-26
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多