【问题标题】:how to prevent division by zero without handling exception java如何在不处理异常java的情况下防止被零除
【发布时间】:2018-08-02 12:46:58
【问题描述】:

我有两个班级: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 列表为空,那么它根本不会进入循环?

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

提前致谢。

【问题讨论】:

  • 使用条件语句。 if ( divisor != 0 ) { // 执行除法 } // 其余代码

标签: java error-handling


【解决方案1】:

这就是 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);
}

【讨论】:

    【解决方案2】:

    另一种解决方案是使用汇总统计信息。 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。

    如果您需要多个汇总值,则速度更快,但如果您只需要一个,则速度较慢。

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2012-12-16
      • 2020-03-08
      • 1970-01-01
      相关资源
      最近更新 更多