基本文件扫描程序异常/问题

时间:2015-10-25 23:43:47

标签: java exception java.util.scanner

我正在为我的班级编写一个程序,要求我从txt文件中读取数据,然后再将其显示出来。我创建了一个读取hasNext的while循环,但是我遇到了异常。它说这是“没有这样的元素例外”,我不知道为什么。循环工作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次和最后时间消失。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您正在循环中读取 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();    

答案 1 :(得分:1)

让我们找到问题的根源。为了轻松实现这一点,让我们将您的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读者为你做解析