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

标签 java object text-files java.util.scanner inputmismatchexception

我是 Java 新手,我正在尝试使用扫描仪从文本文件中读取一些数据。扫描器可以很好地读取字符串和整数数据成员,但是当它达到 double 时,它会抛出 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;
    }

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

最佳答案

非常感谢@Sotirios指出我对问题的错误结束。您的问题是由于扫描仪中使用了不正确的图案引起的。根据您向我们展示的输入文件的片段,每个逗号后面有空格。因此,您应该使用以下模式来反射(reflect)这一点:

,\\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

关于java - (Java) 扫描仪未从文件中读取 nextDouble(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060498/

相关文章:

c# - 限制文本日志文件的好方法

java - PowerMock 模拟外部库

java - 无法将 JavaEE 应用程序部署到 Glassfish 4.1

java - Java ArrayList 支持稀疏索引吗?

javascript - 从一系列键中提取相同的值

javascript - 根据键值从对象数组中提取所有值

java - Clojure 中的定时素数生成

javascript - 我需要一些关于 javascript 对象的指导

python - 将打印语句写入文本文件

java - 以二叉搜索树格式存储数据的硬拷贝