Try-Catch While循环卡在No Such Element Exception上

时间:2016-08-31 02:31:23

标签: java while-loop try-catch

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语句应该采用什么样的格式以确保它不会无限循环

3 个答案:

答案 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(); ... 读取,无论之后是否有 你刚刚破坏了。

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

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

答案 2 :(得分:0)

其他答案看起来对我来说。只是添加一些尚未说过的内容:

  1. 捕获异常时,请确保不要通过打印出该信息来吞下它(即忽略它)。如果有的话,你会丢失e.printStackTrace()所暴露的信息,这就是告诉你它究竟在哪条线路上失败了。
  2. 您遇到的实际错误是因为扫描程序使用,作为分隔符,因此这意味着最后一个值将类似10\n(如果10是行的最大信用点) )。您可以通过执行以下操作来解决此问题:String[] words = scanner.nextLine().split(",");而不是使用扫描仪逐字处理它。