Java 如何在不处理异常的情况下防止被零除
我有两个班:Java 如何在不处理异常的情况下防止被零除,java,error-handling,Java,Error Handling,我有两个班:学生和大学 public class University { private String name; private List<Student> students; public University(String name) { this.name = name; this.students = new ArrayList<Student>(); } 因此,如果列表中没有学生,我会得到被零除的结果,我试图用try\catch
学生
和大学
public class University {
private String name;
private List<Student> students;
public University(String name) {
this.name = name;
this.students = new ArrayList<Student>();
}
因此,如果列表中没有学生,我会得到被零除的结果,我试图用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"");
或者检查它可能没有意义,因为如果学生
列表为空,那么它就不会进入循环
我知道这个问题很简单,但我只是在研究,所以我想知道将来哪种方式更好。
也许还有一个隐藏的问题或什么?用boundaris值还是别的什么
提前感谢。这就是为什么会有陈述。不要限制自己使用它们:)最好是在方法的开头检查。比如:
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);
}
private双倍平均(列出学生){
return students.stream()
.mapToDouble(学生::getKnowledge)
.average()
.orElse(0.0);
}
另一个解决方案是使用摘要统计信息。
除平均值外,它还包含有关最小值、最大值、总值及其总和的信息。
如果您需要多个摘要值,但又不希望生成多个集合流,则广泛使用此选项:
public static double average() {
return students.stream()
.mapToDouble(Student::getKnowledge)
.summaryStatistics()
.getAverage();
}
如果集合为空,则默认情况下它将返回0.0
如果需要多个摘要值,则速度更快;如果只需要一个,则速度较慢。使用条件语句。如果(除数!=0){//执行除法}//代码的其余部分
public static double average() {
return students.stream()
.mapToDouble(Student::getKnowledge)
.summaryStatistics()
.getAverage();
}