首页 > 解决方案 > 如何在不处理异常java的情况下防止被零除

问题描述

我有两个班级: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;
    }
}

所以如果列表中没有学生,我会被零除,我试图用一个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列表为空,那么它就不会进入循环?

我知道这个问题很简单,但我只是在学习,所以我想知道将来选择哪种方式更好。而且也许还有隐藏的问题或什么?有边界值还是什么?

提前致谢。

标签: javaerror-handling

解决方案


这就是为什么存在 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);
}

推荐阅读