繁体   English   中英

Try-Catch While循环卡在无此类元素异常上

[英]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 ,无论是否有你刚刚捣毁了行之后什么。

您应该执行以下操作之一:

  1. 捕获该行并对其进行解析(而不是在以下几行中调用input.next()input.nextInt() ); 要么
  2. 消除对input.nextLine()的调用,并希望每一行都正确符合您期望的布局; 要么
  3. 用对csv解析实用程序的调用替换整个while循环(如@Scary Wombat在评论中建议的那样)。

其他答案对我来说似乎正确。 只是添加一些还没有说过的内容:

  1. 捕获异常时,请确保不要仅通过打印出该信息就将其吞下(即将其忽略)。 如果有的话,您将丢失e.printStackTrace()将公开的信息,这将告诉您确切的错误发生在哪一行。
  2. 您遇到的实际错误是因为扫描程序使用,作为定界符,因此这意味着最后一个值将类似于10\\n (如果10是一行的最大信用额)。 您可以通过执行类似的操作来解决此问题: String[] words = scanner.nextLine().split(","); 而不是使用扫描仪逐字处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM