Java 基本文件扫描程序异常/问题
我正在为我的类编写一个程序,它要求我从txt文件中读取数据,然后再显示回来。我创建了一个while循环,用于读取hasNext,但遇到了一个异常。它说这是“没有这样的元素例外”,我不知道为什么。循环运行了5次迭代,然后给出了异常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
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你的答案很好(值得投票),而且没有过时。有两个几乎相同的答案是可以的——用不同的方式一起解释同一件事比单独解释更有用。谢谢你们两位的帮助!请注意,如果您对异常有疑问,发布整个异常及其堆栈跟踪非常重要。所以,请把这个问题加在你的问题上。那正是我的问题!非常感谢你的帮助!把它画出来真的很有帮助,我对编程真的很陌生,所以通过可视化,我可以马上看到我的问题。