扫描仪在输入文件的最后失败

时间:2014-03-02 02:07:48

标签: java java.util.scanner

我有以下代码:

    Scanner in = new Scanner(new FileReader("in.txt"));

    while(in.hasNext()){
        System.out.println(in.nextLine());
        System.out.println(in.nextLine());
        System.out.println(in.nextDouble());
        System.out.println(in.nextDouble());
        System.out.println(in.nextDouble());

        System.out.println(in.nextLine());
    }

其中in.txt的格式为:

One Name
Second Name
double
double
double
One Name
Second Name
double
double
double
...

但是,while循环在输入文件的最后一行失败。它会打印整个输入文件,但是当它完成后,我会收到一条错误消息:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1585)
    at start.Start.main(Start.java:22)
Java Result: 1

3 个答案:

答案 0 :(得分:3)

每次读取前都必须调用hasNext()方法,因为如果为true,则此方法可以保证至少还有一个元素可供读取。你的阅读应该是这样的:

    if (in.hasNext())
        System.out.println(in.nextLine());
    if (in.hasNext())
        System.out.println(in.nextLine());
    if (in.hasNext())
        System.out.println(in.nextDouble());
    if (in.hasNext())
        System.out.println(in.nextDouble());
    if (in.hasNext())
        System.out.println(in.nextDouble());

    if (in.hasNext())
        System.out.println(in.nextLine());

答案 1 :(得分:0)

根据您的输入文件,模式为:

One Name
Second Name
double
double
double

所以你的while循环必须匹配这个模式才能将文件读作

while(in.hasNext()){
    System.out.println(in.nextLine());
    System.out.println(in.nextLine());
    System.out.println(in.nextDouble());
    System.out.println(in.nextDouble());
    System.out.println(in.nextDouble());
}

为了更好地处理异常情况,你应该在阅读@rendon建议的每一行之前使用正确的hasNextXXX()方法。

希望这有帮助。

答案 2 :(得分:0)

按如下方式重写代码,它将打印所有值

while(in.hasNext()){
        System.out.println(in.nextLine());
    }