【问题标题】:Reading From File With Comma Delimeter Error从带有逗号分隔符错误的文件中读取
【发布时间】:2016-10-06 04:37:42
【问题描述】:

这是我要读取的 .txt 文件

20,Dan,09/05/1990,3,Here
5,Danezo,04/09/1990,99,There

这就是我的做法。每当 .txt 文件只有一行时,它似乎可以正常读取文件。每当读取多行时,我都会收到此错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "Danezo"
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 AttackMonitor.readFromFile(AttackMonitor.java:137)
at AttackMonitor.monitor(AttackMonitor.java:57)
at MonsterAttackDriver.main(MonsterAttackDriver.java:14)
Java Result: 1

这是 readfromfile 代码。

 private void readFromFile() throws FileNotFoundException, IOException
    {
        monsterAttacks.clear();
        Scanner read = new Scanner(new File("Attacks.txt"));
        read.useDelimiter(",");
        String fullDateIn = "";
        int attackIdIn = 0;
        int attackVictimsIn = 0;
        String monsterNameIn= "";
        String attackLocationIn= "";
        while (read.hasNext())
        {
           attackIdIn = Integer.parseInt(read.next());
           monsterNameIn = read.next();
           fullDateIn = read.next();
           attackVictimsIn = Integer.parseInt(read.next());
           attackLocationIn = read.next();
           monsterAttacks.add(new MonsterAttack(fullDateIn, attackIdIn, attackVictimsIn, monsterNameIn, attackLocationIn));

        }
        read.close();
    }

【问题讨论】:

    标签: java arraylist io readfile


    【解决方案1】:

    发生的情况是,在每一行的末尾都有一个换行符,目前 不是 分隔符。因此,您的代码试图将其读取为下一行的 first 整数,但事实并非如此。这导致了解析异常。

    要解决此问题,您可以尝试在要扫描的分隔符列表中添加换行符:

    Scanner read = new Scanner(new File("Attacks.txt"));
    read.useDelimiter("[,\r\n]+");  // use just \n on Linux
    

    另一种方法是从文件中读取每一整行并以逗号分隔:

    String[] parts = read.nextLine().split(",");
    
    attackIdIn = Integer.parseInt(parts[0]);
    monsterNameIn = parts[1];
    fullDateIn = parts[2];
    attackVictimsIn = Integer.parseInt(parts[3]);
    attackLocationIn = parts[4];
    

    【讨论】:

      【解决方案2】:

      您可以使用比格莱森的建议。否则,您可以执行以下操作。 在您的 while 循环中,您使用 hasNext 作为条件。取而代之的是,您可以使用 while (read.hasNextLine()) 并在循环中获取 nextLine ,然后将其拆分为分隔符并进行处理。那将是更合适的方法。

      例如

      while (read.hasNextLine()) {
          String[] values = scanner.nextLine().split(".");
          // do your rest of the logic
      }
      

      【讨论】:

        【解决方案3】:

        将 while 循环内容放入 try catch,并捕获 NumberFormatException。因此,无论何时捕获代码,您都可以理解您尝试将字符串转换为 int。 如果您的业务得到解释,可以提供更多帮助。

        【讨论】:

          【解决方案4】:

          attackLocationIn = read.next(); 这个值取为“Here\n 5”,因为 Here 和 5 之间没有逗号,并且有换行符。 所以第二次迭代attackIdIn = Integer.parseInt(read.next()); 这里read.next() 值是“Danezo”它是字符串,你正在尝试解析为整数。这就是您收到此异常的原因。

          我的建议是使用BufferReader 逐行读取并用逗号分隔每一行。它也会很快。

          或其他解决方案在每行末尾添加逗号并在代码中使用read.next().trim()。就是这样,它只需对您当前的代码进行最小的更改即可工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多