基本文件扫描器异常/问题



我正在为我的类编写一个程序,该程序要求我从一个txt文件中读取数据,然后将其显示回来。我已经创建了一个while循环,读取hasNext,但我遇到了一个异常。它说这是一个"没有这样的元素例外",我不知道为什么。循环工作了5次迭代,然后给出异常

import java.util.Scanner;
import java.text.DecimalFormat;
import java.io.*;
public class Project2_William_Walker
{
    public static void main (String[]args) throws IOException
    {
      File file = new File ("boarding.txt");
      Scanner inputFile = new Scanner(file);
      DecimalFormat df = new DecimalFormat("0.00");
      String title = "Madison Kennel & Grooming";   
      String fName;
      String lName;
      String breed;
      String weight;
      String age;
      double highRisk = 20.00;


      while (inputFile.hasNext())
      {
         fName = inputFile.nextLine();
         lName = inputFile.nextLine();
         breed = inputFile.nextLine();
         weight = inputFile.nextLine();
         age = inputFile.nextLine();
         inputFile.nextLine();
         System.out.println(fName + " " + lName + " " + breed + " " + weight + " " + age);
         System.out.println();

      }
      inputFile.close();    
      System.out.println("End of Program");
   }
}

在我的txt文件中,我有一个列表,它有一个名字,然后是姓氏,然后是品种,体重,然后是年龄。如下所示:

Will  
Walker  
Pug  
3  
4  
John  
Appleseed  
Retriever  
15  
7  

. .以此类推,再加4个元素。我的循环通过前5个很好,但然后在第6次,也就是最后一次通过时就失败了。谢谢你的帮助!

在循环中读取6行,但是循环条件只检查是否(至少)有1行要读取。

您可能在输入文件的末尾有一个额外的空行,这导致hasNext()在读入最后一块数据后返回true

你最好使用for循环迭代5次,每次检查是否有一行可用,每次将数据保存到数组中。

类似:

String[] data = new String[5];
while (inputFile.hasNext()) {
    Arrays.fill(data, null); // clear out array, in case input is short
    for (int i = 0; i < 5 && inputFile.hasNext(); i++)
        data[i] = inputFile.nextLine();
    if (inputFile.hasNext())
        inputFile.nextLine();
    System.out.println(data[0] + " " + data[1] + " " + data[2] + " " + data[3] + " " + data[4]);
    System.out.println();
}
inputFile.close();    

让我们找到问题的根源。为了方便地做到这一点,让我们将nextLine()调用"映射"到文件内容:

Iteration  Code                              Read line from file
   1       fName = inputFile.nextLine();     Will
   1       lName = inputFile.nextLine();     Walker
   1       breed = inputFile.nextLine();     Pug
   1       weight = inputFile.nextLine();    3
   1       age = inputFile.nextLine();       4
   1       inputFile.nextLine();             (empty line between blocks)
   2       fName = inputFile.nextLine();     John
   2       lName = inputFile.nextLine();     Appleseed
   2       breed = inputFile.nextLine();     Retriever
   2       weight = inputFile.nextLine();    15
   2       age = inputFile.nextLine();       7
   2       inputFile.nextLine();             

可以看到,最后一条语句inputFile.nextLine()试图从文件中读取一行,但是没有什么可读的了,因为"7"是最后一行。所以你的问题是你期望总是在一个块之后有一个空行。

一个快速的解决方案是添加一个检查,像这样:

if (inputFile.hasNextLine())
    inputFile.nextLine();

但是,如果没有空行来分割两个块,并且下一个块正好在上一个块之后开始,这可能会导致问题。

首先要避免这样的问题,我建议使用不同的文件结构。例如,您可以使用带有","作为分隔符的csv:

,沃克,哈巴狗,3、4
约翰,别忘了,寻回犬15 7

然后这样读:

final String line = inputFile.nextLine(); // read a single line
final String[] items = line.split(",");  // split that line using ','
fName = items[0];
lName = items[1];
breed = items[2];
weight = items[3];
age = items[4];
System.out.println(fName + " " + lName + " " + breed + " " + weight + " " + age);

为了使它更好:创建一个模型类,它包含必要的字段来表示这样的行(或您以前的文件样式的块),并让像Jackson这样的csv阅读器为您进行解析。

最新更新