线程“主”中的异常java.util.NoSuchElementException:找不到行找不到文件

时间:2019-02-28 10:09:18

标签: java java.util.scanner

我是编码的新手,我正尝试跟着培训视频一起学习。我已经按照步骤操作,但是无法读取保存到项目文件夹中的文件。任何帮助将不胜感激。

returns totalNumOfPoints

2 个答案:

答案 0 :(得分:1)

您使用了错误的扫描器​​方法来使用分隔符将数据读取为标记。 next()查找并返回此扫描器的下一个完整令牌。在完整令牌之前,然后是与定界符模式匹配的输入

nextLine()将此扫描仪前进到当前行并返回跳过的输入。此方法返回当前行的其余部分,但不包括末尾的任何行分隔符。

因此nextLine()不考虑定界符。在您的情况下,代码String second = scLine.nextLine();不会被评估,因为该行已被使用。

使用next()代替nextLine()。应该可以。

答案 1 :(得分:1)

您的问题是如何使用扫描仪。您正在使用String line = scFile.nextLine();从文件中读取一行,这很好。然后,您尝试使用另一个Scanner实例将元素从行中分离出来,这通常也是个好主意,但是您的问题在以下代码段中:

Scanner scLine = new Scanner(line).useDelimiter("#");

String first = scLine.nextLine();
String second = scLine.nextLine();

您正在创建Scanner的新实例,并更改其定界符以将元素与line值分开。但是您随后两次调用nextLine(),但是nextLine()没有使用您指定的分隔符。

让我们检查一下implementation of nextLine()(来自OpenJDK Java 8):

public String nextLine() {
    ...
    String result = findWithinHorizon(linePattern, 0);
    if (result == null)
        throw new NoSuchElementException("No line found");
    ...
}

使用的模式是linePattern,它来自linePattern() method。该方法返回hard-coded pattern "\r\n|[\n\r\u2028\u2029\u0085]而不是您指定的分隔符。

您需要改用方法Scanner#next(),该方法使用定界符读取 next 令牌。令牌是包围在定界符中的数据部分。

因此您的代码应为:

Scanner scLine = new Scanner(line).useDelimiter("#");

String first = scLine.next();
String second = scLine.next();