我正在为我的类编写一个程序,该程序要求我从一个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阅读器为您进行解析。