(Java)Scanner无法从文件中读取nextDouble()

3
我刚开始学习Java,尝试使用扫描器从文本文件中读取一些数据。扫描器可以很好地读取字符串和整数数据成员,但是当它遇到一个双精度浮点数时,会抛出InputMismatchException异常。
文本文件的格式如下... 姓,名,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;
    }

我尝试将区域设置为美国,并尝试更改分隔符,但似乎没有任何效果。


@TimBiegeleisen 我尝试在调用src.nextDouble()之后调用src.nextLine(),但仍然出现错误。我还尝试将其作为字符串读取并解析为double,但是仍然出现相同的错误。 - Davis Smith
所以下一个元素不是双精度数。 - user207421
2个回答

0

我解决了这个问题。我使用的分隔符模式看起来像这样(",|\r\n|\n")。因此,扫描器没有看到一个双引号,而是将其与以回车符分隔的姓氏一起包含在字符串中。

这个简单的修复方法是在模式中包含一个回车符。

新的模式看起来像这样 -(",|\r\n|\n|\r")


0
非常感谢 @Sotirios 指出我错误的问题关闭。您的问题是由于在扫描器中使用了不正确的模式造成的。根据您向我们展示的输入文件片段,每个逗号后面都有空格。因此,您应该使用以下模式来反映这一点:
,\\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
}

第一个和第二个字符串能够通过的原因是逗号后面的空格被卷入了下一个字符串中。但是对于数字,你不能这样做,因为额外的空格没有地方去,最终导致了你一直看到的InputMismatchException异常。

那我无法在本地重现您的问题。您应该努力使您的问题可重现,以便其他人可以尝试解决它。 - Tim Biegeleisen
你能读取多少行输入,或者你甚至不能读取一整行吗? - Tim Biegeleisen
它不会读取任何一行。虽然有一个奇怪的事情发生,如果我用if语句包围那个nextDouble,那么它将捕获文件中最后一个double。所有其他的double都保持在它们最初的0.0。 - Davis Smith
很奇怪,我在本地测试时完全没有问题。我认为你需要使用调试器逐行检查代码。这应该能揭示问题所在。 - Tim Biegeleisen
我会做的。谢谢您抽出时间查看此问题。 - Davis Smith
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接