从文件中读取InputMismatchException

时间:2013-09-16 20:35:12

标签: java file-io java.util.scanner

public static void main(String[] args) throws FileNotFoundException {

    File file = new File("data.txt"); // select file
    try{
    Scanner sc = new Scanner(file); // set scanner to file
        try{
            while (sc.hasNextLine()){ 
    Employee employee = new Employee(); //create employee to hold data
            assignData(sc); //read data into employee
            employee.getGross(); //calculate gross pay
            addEmployee(employee);//assign employee to array
            }//end while
        }//end try2
        finally {
            sc.close(); // close file, saving resource usage
        }//end finally
    }//end try1
    catch(IOException e) {
        e.printStackTrace();
    }

public static void assignData(Scanner input){ 
        //accept scanner
        //read necessary input for employee
        EmpID = input.next();****
        LastName = input.next();****
        FirstName = input.next();****
   (LINE 36)Hours = input.nextDouble();
        Rate = input.nextDouble();
    }

数据文件内容

42345 Bruch Max 40 21.50 
23456 Elgar Eddie 43 20.0 
34567 Bach John 30 30 
12345 Wagner Rick 41 30 
88888 Mozart Wolfie 36 40 
65432 Chopin Fred 45 23.25 
72345 Strauss Butch 50 25

编译,我收到错误

"Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextDouble(Scanner.java:2456)
at programassignment1c.Employee.assignData(Employee.java:36) (
at programassignment1c.ProgramAssignment1C.main(ProgramAssignment1C.java:44)

Java结果:1


员工类中的第36行,上面突出显示,它是nextDouble()我做错了什么?即使没有小数位,也可以扫描双打吗?

手动写出来我看到扫描仪开始于:42345并将其设置为EmpID,然后扫描仪通过空格前进到

Bruch并将其设置为LastName,然后扫描仪通过空格前进到Max并将其设置为FirstName,然后扫描仪从空白区域前进到40并将其设置为小时????我没有正确关注扫描仪?

3 个答案:

答案 0 :(得分:1)

我认为你需要在这里使用特定的数据类型方法:

    EmpID = input.nextLine();
     LastName = input.nextLine();
    FirstName = input.nextLine();

尝试使用nextInt/next代替nextLine。由于nextLine会读取整行,当您尝试将其分配给int时,会抛出InputMismatchException }。

答案 1 :(得分:0)

您正在调用nextLine()而不是next(),每次都会读取(并跳过但不使用行分隔符)行。

    EmpID = input.nextLine();
    LastName = input.nextLine();
    FirstName = input.nextLine();
(LINE 36)Hours = input.nextDouble();
    Rate = input.nextDouble();

所以

42345 Bruch Max 40 21.50 // EmpID
23456 Elgar Eddie 43 20.0  // LastName 
34567 Bach John 30 30 // FirstName, but not the new line characters
12345 Wagner Rick 41 30 
88888 Mozart Wolfie 36 40 
65432 Chopin Fred 45 23.25 
72345 Strauss Butch 50 25

见评论。

nextLine()州的javadoc

  

此方法返回当前行的其余部分,不包括任何行   最后的分隔符。

因此nextDouble()调用正在尝试读取不属于double类型的行分隔符,因此会抛出InputMismatchException

你想要线上的每个标记,使用

EmpID = input.next();
LastName = input.next();
FirstName = input.next();
Hours = input.nextDouble();
Rate = input.nextDouble();

next()州的javadoc

  

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

默认情况下分隔符为

Pattern.compile("\\p{javaWhitespace}+");

即。空白字符。


Java命名约定规定变量名称应以小写字母字符开头。

答案 2 :(得分:0)

nextLine()不符合您的要求(因为文件中的数据由空格分隔而不是新行)。

  

因为它使此扫描程序超过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。

所以试试这个

public static void assignData(Scanner input)
{ 
        empID = input.nextInt();
        lastName = input.next();
        firstName = input.next();
        hours = input.nextDouble();
        rate = input.nextDouble();
 }  

注意:我已将变量名称更改为遵循java命名约定。