Java 从数据文件中读取数字行时出现错误或错误
我试图读取一个数据文件,将3行数字存储到一个数组中。我真不知道该怎么做。我甚至不确定我的Java 从数据文件中读取数字行时出现错误或错误,java,file,project,Java,File,Project,我试图读取一个数据文件,将3行数字存储到一个数组中。我真不知道该怎么做。我甚至不确定我的while循环是否正确。这个文件的格式让我很反感。我创建变量来保存潜水员的姓名、学校、分数和难度,但当我将其放入divercore方法时,数字是错误的,或者当我不使用Double.parseDouble()方法时,读取文件时出错。该方法的参数包括跳水次数(1到3)、7个分数的数组和跳水难度(1到4)。我是否也会在每次潜水时调用潜水方法3次?每个潜水员有3次跳水,这就是为什么有3排数字 潜水员等级: p
while
循环是否正确。这个文件的格式让我很反感。我创建变量来保存潜水员的姓名、学校、分数和难度,但当我将其放入divercore
方法时,数字是错误的,或者当我不使用Double.parseDouble()
方法时,读取文件时出错。该方法的参数包括跳水次数(1到3)、7个分数的数组和跳水难度(1到4)。我是否也会在每次潜水时调用潜水方法3次?每个潜水员有3次跳水,这就是为什么有3排数字
潜水员等级:
public class Diver {
private String name;
private String school;
private double [] scoreArray = new double[3];
private double totalScore;
Diver() {
}
Diver(String name, String school) {
this.name = name;
this.school = school;
}
//loop through score array and calculate the total score for each dive attempt
public double [] diveScore(int diveNum, double [] scores, double difficulty) {
double min = min(scores);
double max = max(scores);
for (int i = 0; i < scores.length; i++) {
totalScore += scores[i];
}
totalScore -= max;
totalScore -= min;
totalScore *= difficulty;
for (int i = 0; i < scoreArray.length; i++) {
scoreArray[i] = totalScore;
}
return scoreArray;
}
//finds smallest score in array of scores
private double min(double [] scores) {
java.util.Arrays.parallelSort(scores);
double min = scores[0];
return min;
}
//finds largest score in array of scores
private double max(double [] scores) {
java.util.Arrays.parallelSort(scores);
double max = scores[scores.length - 1];
return max;
}
//calculates total of the 3 dives
public double totalScore() {
for (int i = 0; i < scoreArray.length; i++) {
totalScore += scoreArray[i];
}
return totalScore;
}
public String toString() {
String str = name + ", " + school + ": " + totalScore + "\n" + "Dive 1: " + scoreArray[0] + "\n" + "Dive 2: " + scoreArray[1] + "\n" + "Dive 3: " + scoreArray[2] + "\n";
return str;
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Diver [] divers = new Diver[25];
int numDivers = readFile(divers);
System.out.println(numDivers);
}
public static int readFile(Diver [] divers) throws FileNotFoundException {
File f = new File("divers.dat");
Scanner kb = new Scanner(f);
Diver d;
int count = 1;
int diveNum = 1;
while (kb.hasNextLine()) {
String name = kb.nextLine();
String school = kb.nextLine();
String s1 = kb.next();
String s2 = kb.next();
String s3 = kb.next();
String s4 = kb.next();
String s5 = kb.next();
String s6 = kb.next();
String s7 = kb.next();
String diff = kb.next();
double score1 = Double.parseDouble(s1);
double score2 = Double.parseDouble(s2);
double score3 = Double.parseDouble(s3);
double score4 = Double.parseDouble(s4);
double score5 = Double.parseDouble(s5);
double score6 = Double.parseDouble(s6);
double score7 = Double.parseDouble(s7);
double difficulty = Double.parseDouble(diff);
double [] scores = new double [7];
scores[0] = score1;
scores[1] = score2;
scores[2] = score3;
scores[3] = score4;
scores[4] = score5;
scores[5] = score6;
scores[6] = score7;
count++;
diveNum++;
}
kb.close();
return count;
}
public static void printDivers(Diver [] divers, int numDivers) {
System.out.println("All Divers\n");
for (int i = 0; i < divers.length; i++) {
if (divers[i] != null) {
System.out.println(divers[i]);
}
}
}
这里有一些问题。导致您的异常的因素有: 您可以使用
Scanner
的next()
方法读取一个数字,该方法将行尾字符保留在行尾,然后尝试使用nextLine()
方法读取下一个名称,该方法将返回一个空字符串作为名称,因为扫描仪正在查看行尾
这一点更为复杂,因为名字和学校的每一行后面都有三行,每行八个数字,或者总共二十四个数字,但你只能读八个数字
结果是你得到了“Lucieta Spinelli”和“Bryn Mawr College”,然后是数字8、9、8、7、8、8、2.5作为第一个条目,然后是名字“”和学校“7 8 7 6 7 6 3.7”,然后是数字8、7、6、7、6、8、3.2作为第二个条目,最后你得到了名字“”和学校“李平孙”,然后是数字“罗格斯大学”和“大学”以及
好吧,这就是你能得到的,因为“罗格斯”不是一个数字,当你试图用parseDouble
将它转换成一时,你的程序崩溃了
你也根本没有使用Diver
类;你从来没有创建过一个Diver。将数字读入s1
等等也没有意义,只是解析它们并将它们粘贴到一个数组中;你也可以直接将它们解析到数组中,并将s1
从中去掉,但这是次要的
对kb.close()
的调用应该在finally
块中,否则应该使用来确保文件被关闭
我强烈建议您阅读Eric Lippert的优秀文章;凭借这篇文章所提供的技巧,您可能根本不需要问这个问题。如果您需要实际的项目问题来澄清我的整个段落,那么我也会对此发表评论。我知道我所说的令人困惑。对不起,还有,输出当前代码中,线程“main”java.lang.NumberFormatException中存在异常:对于输入字符串,java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)位于java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)位于java.base/java.lang.Double.parseDouble(Double.java:549)在Main.readFile(Main.java:34)在Main.Main(Main.java:10)1)为每个方法编写单元测试,以验证您的代码是否在做您认为应该做的事情。这是一个非常好的习惯,可以让您非常满意。2)在调试模式下逐行运行代码,这样您就可以观察变量的变化并了解发生了什么。3)您的数组在readFile()中获得了双[]分方法是在该方法中创建的,而不是从该方法返回的。就程序的其余部分而言,此数组也可能不存在!4)请随时就以下任何一点寻求更具体的帮助:)有关该异常的信息应包含在您的问题中。您可以编辑您的问题以添加它,而不只是在把它放在一个容易被忽略的评论中。(另外,关于SO的评论不像问题和答案那样永久;版主可以出于各种原因删除它们。)你可以使用调试器。或者你可以放很多打印语句。我建议你在解析它们之前打印出你刚读过的所有项目。这会很有启发性。
Lucieta Spinelli
Bryn Mawr College
8 9 8 7 8 8 8 2.5
7 8 7 6 7 7 6 3.7
8 7 6 7 7 6 8 3.2
LiPing Sun
Rutgers University
6.5 5 9.5 7.5 8 8.5 7 2.3
7 9 7.5 9 8.5 6.5 8 2.6
6 4 5 9 7 8 6 3.0
Greg McEntire
University of Southern California
9 8 8.5 9.5 9 9.5 7 2.3
9 7 8 8 7.5 8.5 7.5 2.6
8 8 8 8 8 8 8 3.4
Shiva Vadaparthy
Northwestern University
9 8 9.5 9.5 7.5 8 8.5 3.0
8 9 8.5 7.5 9 8.5 8 3.6
7.5 9 8 7 8.5 8 7 4.1
Elizabeth Bennet
Oxford University
7 8 9 8 7 7 8 2.4
8 8 6 7 9 7 8 2.7
8 7 8 6 9 8 9 3.0
Sofia Berrios
Universidad Simon Bolivar
8.5 7.5 9.5 9 7 8.5 8 2.4
8 7 8 9 8 6 7 3.0
7 5.5 6.5 7 5 6.5 7 3.6
Amir Majid
Reed College
4 5 6 5 3 5 7 2.8
7 6 7 8 7 9 8 2.9
8 9 7 9 8.5 8 9 3.4
James Pajuio
University of Pennsylvania
8 7 8 9 8 6 7 2.8
7.5 9 8 7 8.5 8 7 3.0
7.5 9 8 7 8.5 8 7 4.3
Sharon Lewis
Howard University
8 9 9.5 9 8.5 8 9 2.7
4 5 5.5 7 6.5 4.5 5 3.2
8 7 8 9 8 8 7 4.0
Divya Patel
Temple University
7 9 7.5 9 8.5 6.5 8 2.1
8 7 8 6 9 8 9 2.3
3.5 5.5 4 5 3 4 4.5 4.3
Guo Zhang
Portland State University
5 6 5.5 7 6.5 7 5.5 6 3.0
8 7 8.5 9 7.5 8.5 8 3.2
9 8 9.5 8.5 9 8.5 9.5 4.1
Tomasz Wojaczyk
Tufts University
8 8 7 8 7 8 7 2.6
5 4 5 6 7 5 5 2.9
8 6 6 7 8 7 6 3.6