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

Java 基本文件扫描程序异常/问题,java,exception,java.util.scanner,Java,Exception,Java.util.scanner,我正在为我的类编写一个程序,它要求我从txt文件中读取数据,然后再显示回来。我创建了一个while循环,用于读取hasNext,但遇到了一个异常。它说这是“没有这样的元素例外”,我不知道为什么。循环运行了5次迭代,然后给出了异常 import java.util.Scanner; import java.text.DecimalFormat; import java.io.*; public class Project2_William_Walker { public static v

我正在为我的类编写一个程序,它要求我从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  
if (inputFile.hasNextLine())
    inputFile.nextLine();
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);

…以此类推,再输入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();    
String[]data=新字符串[5];
while(inputFile.hasNext()){
Arrays.fill(data,null);//清除数组,以防输入短
对于(int i=0;i<5&&inputFile.hasNext();i++)
data[i]=inputFile.nextLine();
if(inputFile.hasNext())
inputFile.nextLine();
System.out.println(数据[0]+“”+数据[1]+“”+数据[2]+“”+数据[3]+“”+数据[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”是最后一行。所以,您的问题是,您希望在一个块之后总是有一个空行

快速修复方法是添加支票,如下所示:

Will  
Walker  
Pug  
3  
4  

John  
Appleseed  
Retriever  
15  
7  
if (inputFile.hasNextLine())
    inputFile.nextLine();
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);
但是,如果没有空行来分割两个块,而下一个块正好在最后一个块之后开始,那么这可能会造成麻烦

为了首先避免此类问题,我将重新编译一个不同的文件结构。例如,可以使用带“,”的a作为分隔符:

威尔,沃克,帕格,3,4
约翰,苹果色,猎犬,15,7岁

这样读:

Will  
Walker  
Pug  
3  
4  

John  
Appleseed  
Retriever  
15  
7  
if (inputFile.hasNextLine())
    inputFile.nextLine();
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);

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

“但是循环条件只检查是否(至少)有一行要读”,这不会是一个问题(但仍然有代码气味和容易出错)如果最后一个块不包含五行…:这个“输入文件末尾可能有一个空行”可以解决他的问题。@tomoops!你说得对。我完全忘记了需要额外的检查。希望它现在看起来更好。是的,它更好:D。很遗憾你错过了它,因为我还写了一个答案来解释如何修复它(因为你错过了:P),但它现在已经过时了。@Tom你的答案很好(值得投票),而且没有过时。有两个几乎相同的答案是可以的——用不同的方式一起解释同一件事比单独解释更有用。谢谢你们两位的帮助!请注意,如果您对异常有疑问,发布整个异常及其堆栈跟踪非常重要。所以,请把这个问题加在你的问题上。那正是我的问题!非常感谢你的帮助!把它画出来真的很有帮助,我对编程真的很陌生,所以通过可视化,我可以马上看到我的问题。