使用Scanner的nextLine()和hasNextLine()方法时出现问题

Har*_*ish 7 java java.util.scanner

我有一个包含以下数据的日志文件:

最短路径(2):: RV3280-RV0973C-RV2888C
最短路径(1):: RV3280-RV2502C
最短路径(2):: RV3280-RV2501C-RV1263
最短路径(2):: RV2363-Rv3285-RV3280

从每一行,我需要括号内的数字,第一个蛋白质的名称(第一行中的RV3280)和最后一个蛋白质的名称(第一行中的RV2888C).

我用这个Scanner对象编写了一个代码.

try{
                Scanner s = new Scanner(new File(args[0]));
                while (s.hasNextLine()) {
                    s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern
                    MatchResult result = s.match(); // results from
                    for (int i=1; i<=result.groupCount(); i++) {
                        System.out.println(result.group(i));
                    }
                    s.nextLine(); // line no. 29
                }
                s.close();
        }

        catch (FileNotFoundException e) {
            System.out.print("cannot find file");
        }
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果,但我也收到了一条错误消息.我得到的上述输入文件的输出是:

Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Scanner.java:1516)
        at nearnessindex.Main.main(Main.java:29)
2
RV3280
RV2888C
1
RV3280
RV2502C
2
RV3280
RV1263
2
RV2363
RV3280
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误以及如何纠正错误?

Key*_*Key 3

您的输入数据可能不以行分隔符结尾,这会导致这种情况。调用将findInLine扫描仪移过匹配模式,如果调用时位于输入数据的末尾,nextLine则会抛出NoSuchElementException

无需过多重新安排代码的简单修复方法是通过以下方式结束 while 循环:

if (s.hasNextLine()) {
    s.nextLine();
}
Run Code Online (Sandbox Code Playgroud)