【问题标题】:Try-Catch While loop getting stuck on No Such Element ExceptionTry-Catch While 循环卡在 No such Element Exception
【发布时间】:2016-08-31 02:31:22
【问题描述】:
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 语句应该采用什么确切格式以确保它不会无限循环.

【问题讨论】:

  • 看起来你正在处理一个csv文件,所以你应该使用一个csv阅读器库

标签: java while-loop try-catch


【解决方案1】:

try 块中的第一行读取可用行,然后将其丢弃:

while (input.hasNextLine()) {
    try {
        input.nextLine();
        ...

您收到异常的原因是您丢弃了刚刚检查的行,然后继续尝试从input 读取,无论您在该行之后是否有任何内容刚刚被扔掉了。

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

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

【讨论】:

    【解决方案2】:

    使用 Scanner 您需要使用 hasNextLine() 检查是否有下一行 所以循环变成了

    while(sc.hasNextLine()){
      str=sc.nextline();
    //...
    }
    

    此代码取决于输入的格式是否正确

    您正在调用 nextLine() 并且它在没有行时抛出异常,正如 javadoc 所描述的那样。它永远不会返回 null

    【讨论】:

      【解决方案3】:

      其他答案对我来说是正确的。只是补充一些尚未说过的内容:

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

      【讨论】:

        猜你喜欢
        • 2017-10-09
        • 2015-04-24
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多