(Java)扫描仪未从文件中读取nextDouble()

(Java)扫描仪未从文件中读取nextDouble(),java,object,text-files,java.util.scanner,inputmismatchexception,Java,Object,Text Files,Java.util.scanner,Inputmismatchexception,我是Java新手,我正在尝试使用扫描仪从文本文件中读取一些数据。扫描器可以很好地读取字符串和整数数据成员,但当它达到一个双精度时,会抛出一个InputMismatchException 文本文件的格式如下所示 Lastname,Firstname,0,0.0 史密斯,约翰,10,2.456 琼斯,威廉,15,3.568 这是我的密码 import java.io.FileNotFoundException; import java.util.Scanner; import java.io.Fil

我是Java新手,我正在尝试使用扫描仪从文本文件中读取一些数据。扫描器可以很好地读取字符串和整数数据成员,但当它达到一个双精度时,会抛出一个InputMismatchException

文本文件的格式如下所示

Lastname,Firstname,0,0.0
史密斯,约翰,10,2.456
琼斯,威廉,15,3.568

这是我的密码

import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.File;

public class Student {

    int age;
    double gpa;
    String firstName;
    String lastName;

    public static void main (String[] args) {
        int iNum = 0;
        double dNum = 0.0;
        String str1 = "";
        String str2 = "";
        List<Student> listOfObjects = new ArrayList<>();

        try {
            Scanner src = new Scanner(new
                     File("data.txt")).useDelimiter(",|\r\n|\n");

            while (src.hasNext()) {
                str1 = src.next();  //last name
                str2 = src.next();  //first name
                iNum = src.nextInt();  //age
                dNum = src.nextDouble();  /* gpa - having trouble reading these doubles with Scanner */             

                Student object = new Student(str1, str2, iNum, dNum);
                listOfObjects.add(object); //add new object to list

            }
        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        for (Student a: listOfObjects)   // printing the sorted list
            System.out.print(a.getStudentLastName() + ", " +  
            a.getStudentFirstName() +
            ", " + a.getStudentAge() + ", " + a.getStudentGpa() + "\n");
    }

    public Student(String str1, String str2, int iNum, double dNum){
        this.lastName = str1;
        this.firstName = str2;
        this.age = iNum;
        this.gpa = dNum;
    }

    public String getStudentFirstName() {
        return firstName;
    }

    public String getStudentLastName() {
        return lastName;
    }

    public int getStudentAge() {
        return age;
    }

    public double getStudentGpa() {
        return gpa;
    }
import java.io.FileNotFoundException;
导入java.util.Scanner;
导入java.io.File;
公立班学生{
智力年龄;
双gpa;
字符串名;
字符串lastName;
公共静态void main(字符串[]args){
int iNum=0;
双dNum=0.0;
字符串str1=“”;
字符串str2=“”;
List-listOfObjects=new-ArrayList();
试一试{
扫描仪src=新扫描仪(新
文件(“data.txt”)。使用分隔符(“,|\r\n |\n”);
while(src.hasNext()){
str1=src.next();//姓氏
str2=src.next();//名字
iNum=src.nextInt();//年龄
dNum=src.nextDouble();/*gpa-无法使用扫描仪读取这些双精度值*/
学生对象=新学生(str1、str2、iNum、dNum);
添加(对象);//将新对象添加到列表
}
} 
catch(filenotfounde异常){
e、 printStackTrace();
}
for(学生a:listOfObjects)//打印已排序的列表
System.out.print(a.getStudentLastName()+“,”+
a、 getStudentFirstName()+
“,“+a.getStudentAge()+”,“+a.getStudentGpa()+”\n”);
}
公立学生(字符串str1、字符串str2、整数iNum、双dNum){
this.lastName=str1;
this.firstName=str2;
这个年龄=iNum;
这个.gpa=dNum;
}
公共字符串getStudentFirstName(){
返回名字;
}
公共字符串getStudentLastName(){
返回姓氏;
}
公共int getStudentAge(){
回归年龄;
}
公共双getStudentGpa(){
返回gpa;
}

我尝试为我们设置区域设置并尝试弄乱分隔符,但似乎没有任何效果。

非常感谢@Sotirios调用了我错误的问题结束语。您的问题是由于扫描仪中使用了错误的模式造成的。根据您向我们展示的输入文件片段,e后面有空格因此,您应该使用以下模式来反映这一点:

,\\s*|\r\n|\n
^^^^^ match a comma, followed by zero or more spaces
当我在本地测试时,我甚至没有得到
double
值,它在读取第三位整数时崩溃。请尝试以下代码:

Scanner src = new Scanner(new File("data.txt")).useDelimiter(",\\s*|\r\n|\n");
while (src.hasNext()) {
    str1 = src.next();
    str2 = src.next();
    iNum = src.nextInt();
    dNum = src.nextDouble();

    Student object = new Student(str1, str2, iNum, dNum);
    listOfObjects.add(object); //add new object to list
}

前两个字符串之所以能够通过,是因为逗号后的空格被卷到了下一个字符串中。但是你不能用数字来解决这个问题,在这种情况下,多余的空格无处可去,你最终得到了你一直看到的
输入不匹配异常。

我解决了这个问题。熟食店我使用的斜接模式看起来像这样(“,|\r\n |\n”)。因此扫描器没有看到一个双精度字符,而是将其包含在字符串中,姓氏由回车符分隔

解决这个问题的简单方法是在模式中包含回车符


新模式如下-(“,|\r\n |\n |\r”)

@TimBiegeleisen在调用src.nextDouble()之后,我尝试调用src.nextLine(),但仍在抛出错误。我还尝试将其作为字符串读入并解析为double,但出现了相同的错误。因此,下一个元素不是double。抱歉,我更新了帖子,以显示逗号后没有空格。这是我的错误。我仍然尝试了此模式,但没有效果。然后我无法重现您的问题em本地。你应该努力使你的问题重现,以便其他人可以尝试解决它。你能读多少行输入,或者你甚至不能读一行完整的输入?它甚至读不到一行。尽管发生的一件奇怪的事情是,如果我用if语句包围下一个双行,那么它将捕获最后一个d文件中有两个。所有其他的替身都保持在最初的0.0。你能通过PasteBin或类似的方式在线提供该文件吗?