public static ArrayList<Student> readStudentRecords(String fileName) throws FileNotFoundException {
Scanner input = new Scanner(new FileInputStream(fileName));
ArrayList<Student> students = new ArrayList<Student>();
input.useDelimiter(",");
String firstName, lastName, id, email, hashPW;
int maxCredits = 0;
while (input.hasNextLine()) {
try {
input.nextLine();
firstName = input.next();
lastName = input.next();
id = input.next();
email = input.next();
hashPW = input.next();
maxCredits = input.nextInt();
Student student = new Student(firstName, lastName, id, email, hashPW, maxCredits);
students.add(student);
} catch (IllegalArgumentException e) {
System.out.println("Illegal Argument Exception");
input.next();
} catch (NoSuchElementException e) {
System.out.println("No Such Element Exception");
input.next();
}
}
input.close();
return students;
}
我正在创建一个程序来读取一个文本文件,其中列出了学生的名字,姓氏,ID,电子邮件,哈希密码和最大学分。文本文件的每一行都有一个由逗号分隔的每个元素的完整套件。我希望程序读取文件,从每一行创建一个学生对象(我创建并测试了Student类,包括所有getter和setter),并将学生对象排列在数组列表中。该程序在NoSuchElementException中循环,并且只读取文本文件的第一行,并忽略下一个9.我不确定我的try-catch语句应该采用什么样的格式以确保它不会无限循环
答案 0 :(得分:0)
Scanner 您需要检查下一行是否有hasNextLine() 所以循环变为
while(sc.hasNextLine()){
str=sc.nextline();
//...
}
此代码取决于输入是否格式正确
你正在调用 nextLine(),并且当没有行时它会抛出异常,就像javadoc描述的那样。它永远不会返回null
答案 1 :(得分:0)
for j=3:100
if F(j) = non empty
F(j).name = E(j)
else end
next j
end
块中的第一行读取可用行,然后将其丢弃:
try
您获得异常的原因是您丢弃刚刚检查过的行,然后继续尝试从while (input.hasNextLine()) {
try {
input.nextLine();
...
读取,无论之后是否有 你刚刚破坏了。
您应该执行以下操作之一:
input
或input.next()
);或input.nextInt()
的调用,并希望每一行都符合您期望的布局;或input.nextLine()
循环(如@Scary Wombat在评论中建议的那样)。答案 2 :(得分:0)
其他答案看起来对我来说。只是添加一些尚未说过的内容:
e.printStackTrace()
所暴露的信息,这就是告诉你它究竟在哪条线路上失败了。,
作为分隔符,因此这意味着最后一个值将类似10\n
(如果10是行的最大信用点) )。您可以通过执行以下操作来解决此问题:String[] words = scanner.nextLine().split(",");
而不是使用扫描仪逐字处理它。