首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取文件,InputMismatchException

读取文件,InputMismatchException
EN

Stack Overflow用户
提问于 2013-09-16 20:35:11
回答 2查看 2.9K关注 0票数 0
代码语言:javascript
复制
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();
    }

数据文件内容

代码语言:javascript
复制
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

编译,我得到错误

代码语言:javascript
复制
"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,然后扫描仪将过去的空白推进到

它将此设置为LastName,然后扫描仪将过去的空白推进到最大,并将其设置为FirstName,然后扫描仪将过去的空白推进到40,是否应该将其设置为小时?我没有正确地跟踪扫描器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-16 20:37:18

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

代码语言:javascript
复制
    EmpID = input.nextLine();
     LastName = input.nextLine();
    FirstName = input.nextLine();

尝试使用nextInt/next而不是nextLine.As nextLine会读取整行,当您尝试将它赋值给int值时,它会抛出InputMismatchException

票数 1
EN

Stack Overflow用户

发布于 2013-09-16 20:36:51

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

代码语言:javascript
复制
    EmpID = input.nextLine();
    LastName = input.nextLine();
    FirstName = input.nextLine();
(LINE 36)Hours = input.nextDouble();
    Rate = input.nextDouble();

所以

代码语言:javascript
复制
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

如果要在行上使用每个令牌,请使用

代码语言:javascript
复制
EmpID = input.next();
LastName = input.next();
FirstName = input.next();
Hours = input.nextDouble();
Rate = input.nextDouble();

用于next()状态的javadoc

从这个扫描器中查找并返回下一个完整的令牌。一个完整的标记在前面,后面是匹配分隔符模式的输入。

默认情况下,分隔符为

代码语言:javascript
复制
Pattern.compile("\\p{javaWhitespace}+");

即。空白人物。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18836819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档