尝试使用Scanner时,InputMismatchException,我缺少什么?

时间:2016-09-25 01:03:27

标签: java java.util.scanner

package baker;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class FileReader {

    public static void main(String[] args) throws FileNotFoundException {
        String name;
        double height;
        double inches;
        double idealWeight;

        Scanner fileReader;
        fileReader = new Scanner(new FileInputStream("Data/patients.txt"));
        while (fileReader.hasNext()) {

            name = fileReader.next(); 
            System.out.println("Name: ");
            height = fileReader.nextInt();
            inches = fileReader.nextInt(); 

            fileReader.nextLine();
            idealWeight = 110 + (height - 5) * 5 + inches * 5;
            System.out.println("Ideal Weight: " + idealWeight);


    }  
  }
}

此代码抛出以下错误:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at baker.FileReader.main(FileReader.java:22)
C:\Users\SFU\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

错误的最后一行指向第22行,即以下行:

height = fileReader.nextInt();

据我所知,没有理由输入不匹配错误。有什么建议?我在下面发布了有问题的文件(patients.txt)。

Tom Atto
6
3
Eaton Wright
5
5
Cary Oki
5
11

1 个答案:

答案 0 :(得分:1)

原因是您的name作业。您执行以下操作:

name = fileReader.next();

事实是next默认返回由空格分隔的下一个标记。根据{{​​3}}:

  

public String next()

     

查找并返回此扫描仪的下一个完整令牌。在完成令牌之前和之后是与分隔符模式匹配的输入。

因此,您现在可以看到名字和姓氏可能有问题。例如,如果你在文件中有这个:

John Smith

你做了:

scanner.next();

您将只获得John,因为它是下一个完整的令牌,并在该空间分隔。这意味着当你扫描整数时:

scanner.nextInt();

扫描程序将遇到Smith(字符串)并抛出InputMismatchException。使用:

name = fileReader.nextLine();

接收整行。这将产生John Smith。详细了解Javadocs