Java 从数据文件中读取数字行时出现错误或错误

Java 从数据文件中读取数字行时出现错误或错误,java,file,project,Java,File,Project,我试图读取一个数据文件,将3行数字存储到一个数组中。我真不知道该怎么做。我甚至不确定我的while循环是否正确。这个文件的格式让我很反感。我创建变量来保存潜水员的姓名、学校、分数和难度,但当我将其放入divercore方法时,数字是错误的,或者当我不使用Double.parseDouble()方法时,读取文件时出错。该方法的参数包括跳水次数(1到3)、7个分数的数组和跳水难度(1到4)。我是否也会在每次潜水时调用潜水方法3次?每个潜水员有3次跳水,这就是为什么有3排数字 潜水员等级: p

我试图读取一个数据文件,将3行数字存储到一个数组中。我真不知道该怎么做。我甚至不确定我的
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