0
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


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

手写这个我看到扫描仪开始于:42345 并将其设置为 EmpID,然后扫描仪前进过去的空白到

Bruch 并将其设置为 LastName,然后扫描仪将空格前进到 Max 并将其设置为 FirstName,然后扫描仪将空格前进到 40 并将其设置为 Hours???? 我没有正确跟随扫描仪?

4

3 回答 3

1

我相信您需要在这里使用特定的数据类型方法:

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

尝试使用nextInt/next而不是nextLine.AsnextLine将读取整行,当您尝试将其分配给int它抛出的值时InputMismatchException

于 2013-09-16T20:37:18.313 回答
0

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

    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}+");

IE。空白字符。


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

于 2013-09-16T20:36:51.080 回答
0

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

因为它将扫描仪推进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。

所以试试这个

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

注意:我已更改您的变量名称以遵循 java 命名约定。

于 2013-09-16T20:40:21.837 回答