首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能绕过ArithmeticException? /0?

不能绕过ArithmeticException? /0?
EN

Stack Overflow用户
提问于 2020-06-15 19:02:26
回答 2查看 66关注 0票数 0

我在处理从Student类中的getAverageScore()方法获得的ArithmeticException时遇到了问题。我正在尝试编写一个程序来读取下面的文本文件scores.txt

代码语言:javascript
复制
34     c081 c082 c083 c084
S2023  99   75   85   62
S2025  -1   92   67   52
S1909  100  83   45   -1

像c081这样的c数字是学校的课程代码,像s2023这样的s数字是学生编号。中间的数字代表他们的分数,-1也意味着他们没有进入这个单元。

我希望能够写一个程序,在这个程序中,我可以给出他们班级中平均水平最高的学生的输出,以及这个平均值和他们的学生人数。我希望能够确保-1值不包括在班级平均值中,这样,如果学生有其中一个,他们的平均值只计算他们实际选课的班级。

这是Student类:

代码语言:javascript
复制
import java.util.ArrayList;

public class Student {

    private String studentNumber;
    private ArrayList<Integer> scores = new ArrayList<Integer>();

    public Student(String studentText) {
        String[] parts = studentText.split(studentText, ' ');
        this.studentNumber = parts[0];

        for (int i = 1; i < parts.length - 1; i++) {
            scores.add(Integer.parseInt(parts[i + 1]));
        }
    }

    public String getStudentNumber() {
        return this.studentNumber;
    }

    public float getAverageScore() {
        int sum = 0;
        int numberOfCoursesNotTaken = 0;

        for (int i = 0; i <this.scores.size(); i++) {
            if (i != -1) {
            sum += this.scores.get(i);
            System.out.println(sum);
            } else {
                numberOfCoursesNotTaken++ ;
                System.out.println(numberOfCoursesNotTaken);
            }
        }
        return sum / (this.scores.size() - numberOfCoursesNotTaken);
    }


}

我从下面的类中调用这个方法:

代码语言:javascript
复制
import java.io.File; 
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class MySchool {
    public static void main(String[] args) {
        int numberOfStudents;
        ArrayList<Student> allStudents = new ArrayList<Student>() ;

        try {

            File scoresFile = new File("Scores.txt");
            Scanner scoresFileReader = new Scanner(scoresFile);


            String headerRow = scoresFileReader.nextLine();

            char c = headerRow.charAt(0);
            numberOfStudents = Character.getNumericValue(c);  


            for (int studentI = 0; studentI < numberOfStudents; studentI++) {
                String studentText = scoresFileReader.nextLine();
                System.out.println(studentText);
                Student student = new Student(studentText);
                allStudents.add(student);
            }

            scoresFileReader.close();

        } catch (FileNotFoundException e) {
            System.out.println("An error occurred");
            e.printStackTrace();
        }

        float highestAverage = 0;
        String highestScoringStudentNumber = null;


        for (Student student : allStudents) {
            if (student.getAverageScore() > highestAverage) {
                highestAverage = student.getAverageScore();
                highestScoringStudentNumber = student.getStudentNumber();
            }

        }
        System.out.println("Highest scoring student: " + highestScoringStudentNumber);
    }
}

但是,StudentgetAverageScore()的返回行显示以下错误:Exception in thread "main" java.lang.ArithmeticException: / by zero at Student.getAverageScore(Student.java:34) at MySchool.main(MySchool.java:42)

我以为我已经用numberOfCoursesNotTaken变量解决了这个问题?有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 19:26:46

我真的建议在找到无效值后立即删除它们。你可以用下面的代码替换你的Student构造函数:

代码语言:javascript
复制
public Student(String studentText) {
    String[] parts = studentText.split(" "); // previously (studentText, ' ')
    this.studentNumber = parts[0];

    for (int i = 1; i < parts.length - 1; i++) {
        int score = Integer.parseInt(parts[i]); // NOT i+1
        if (score >=0) this.scores.add(score);
    }
}

在此期间,您可以极大地简化平均分的计算(现在没有-1):

代码语言:javascript
复制
public float averageScore() {
   if (scores.isEmpty()) {
      return 0; // avoids divide-by-zero
   } else {
      int total = 0;
      for (int score : scores) total += score;
      return total / (float) scores.size();
   }
}
票数 0
EN

Stack Overflow用户

发布于 2020-06-15 19:11:05

学生班级->:在getAverageScore循环中,你检查的是i != -1,而不是scores.get(i) != -1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62386849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档