[英]Try-Catch While loop getting stuck on No Such Element Exception
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语句应采用哪种确切格式,以确保不会无限循环。 。
使用Scanner,您需要检查hasNextLine()是否存在下一行,从而使循环变为
while(sc.hasNextLine()){
str=sc.nextline();
//...
}
此代码取决于输入格式是否正确
您正在调用nextLine(),并且在没有任何行时会引发异常,这与javadoc所描述的完全相同。 它永远不会返回null
try
块中的第一行读取可用行,然后将其丢弃:
while (input.hasNextLine()) {
try {
input.nextLine();
...
您得到异常的原因是,你扔掉你刚才检查了线那里,然后继续尝试读取input
,无论是否有你刚刚捣毁了行之后什么。
您应该执行以下操作之一:
input.next()
或input.nextInt()
); 要么 input.nextLine()
的调用,并希望每一行都正确符合您期望的布局; 要么 while
循环(如@Scary Wombat在评论中建议的那样)。 其他答案对我来说似乎正确。 只是添加一些还没有说过的内容:
e.printStackTrace()
将公开的信息,这将告诉您确切的错误发生在哪一行。 ,
作为定界符,因此这意味着最后一个值将类似于10\\n
(如果10是一行的最大信用额)。 您可以通过执行类似的操作来解决此问题: String[] words = scanner.nextLine().split(",");
而不是使用扫描仪逐字处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.