提问人:Davis Smith 提问时间:2/6/2017 最后编辑:Davis Smith 更新时间:2/7/2017 访问量:1687
(爪哇)扫描仪未从文件中读取 nextDouble()
(Java) Scanner not reading in nextDouble() from file
问:
我是 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;
}
我尝试将区域设置设置为 US 并尝试弄乱分隔符,但似乎没有任何效果。
答:
0赞
Tim Biegeleisen
2/6/2017
#1
非常感谢@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
评论
0赞
Davis Smith
2/6/2017
对不起,我更新了帖子以显示逗号后没有空格。这是我的一个错别字。无论如何,我仍然尝试了这种模式,但无济于事。
0赞
Tim Biegeleisen
2/6/2017
那么我无法在本地重现您的问题。你应该努力使你的问题可重现,以便其他人可以尝试解决它。
0赞
Tim Biegeleisen
2/6/2017
您可以读取多少行输入,或者您甚至无法读取一整行?
0赞
Davis Smith
2/6/2017
它甚至不会读取一行。尽管发生了一件奇怪的事情,如果我用 if 语句将 nextDouble 括起来,那么它将捕获文件中的最后一个双精度。所有其他双打都保持在最初的 0.0。
0赞
Tim Biegeleisen
2/6/2017
您能否以某种方式在线提供该文件,也许是通过 PasteBin 或类似的东西?
0赞
Davis Smith
2/7/2017
#2
我解决了这个问题。我使用的分隔符模式如下所示(“,|\r\n|\n”)。因此,扫描仪没有看到双精度,而是将其包含在字符串中,姓氏由回车符分隔。
对此的简单解决方法是在模式中包含回车符。
新模式如下所示 - (“,|\r\n|\n|\r”)
评论