如何在不处理异常的情况下防止被零除

时间:2018-08-02 12:46:58

标签: java error-handling

我有两个班级:StudentUniversity

public class University {

private String name;
private List<Student> students;

public University(String name) {    
    this.name = name;
    this.students = new ArrayList<Student>();
}

并且有一个计算平均分数的函数:

 public double average() {
    double average = 0;

    for(Student st: students) {
        average += st.getKnowledge();
    }

    try { 
        return average/students.size();
    }
    catch(ArithmeticException e) {
        System.out.println("Oops, there is no student studying");
        return 0.0;
    }
}

因此,如果列表中没有学生,我将被除以0,并尝试使用try\catch块进行处理。 而且我想知道是否有任何方法可以简化此检查,从而避免使用try catch块?当然,我可以这样实现:

public double average() {
    double average = 0;

    for(Student st: students) {
        average += st.getKnowledge();
    }

    if (students.size() == 0) 
        throw new IllegalArgumentException("Oops, there is no student studying");

    return average/students.size();
}

两个

if (students.size() == 0) 
        System.out.println(""Oops, there is no student studying"");

或者可能没有必要进行检查,因为如果students列表为空,那么它根本就不会进入循环?

我知道这个问题很简单,但我只是在做文章,所以我想在将来知道哪种方法更好。 也许还有一个隐藏的问题或什么?与边界值或其他什么?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

这就是if语句在那里的原因。不要限制自己使用它们:)最好是检查方法的开头。像这样:

public double average() {
    if(students.isEmpty())
        return 0.0;

    double average = 0;

    for(Student st: students) {
        average += st.getKnowledge();
    }            
    return average/students.size();
}

如果您想以更简单的方式对流进行操作,则可以执行以下操作:

private double average(List<Student> students) {
    return students.stream()
            .mapToDouble(Student::getKnowledge)
            .average()
            .orElse(0.0);
}

答案 1 :(得分:1)

另一种解决方案是使用摘要统计信息。 https://docs.oracle.com/javase/8/docs/api/java/util/DoubleSummaryStatistics.html 除平均值外,它还包含有关最小值,最大值,总计值及其和的信息。 如果您需要多个汇总值,但又不想创建多个集合流,则它被广泛使用:

public static double average() {
    return students.stream()
            .mapToDouble(Student::getKnowledge)
            .summaryStatistics()
            .getAverage();
}

如果您的收藏集为空,默认情况下它将返回0.0。

如果需要多个摘要值,则速度较快,但如果仅需要一个摘要值,则速度较慢。