java - 如何在不处理异常java的情况下防止被零除
问题描述
我有两个班级:Student
和University
。
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 语句的原因。不要限制自己使用它们 :) 最好是在方法的开头检查。就像是:
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);
}
推荐阅读
- python - Pandas - 根据来自另一个表的具有相同密钥的不同电子邮件扩展表
- r - 如何在 R 中使用 left_join 函数避免重复
- java - 从 android studio API 28 连接到解析服务器的 i/o 失败
- javascript - 如何在 Ant Design (Antd)、React js 中获取 Dropdown 组件的值
- javascript - 如何使用 mongoose、nodeJs ( Express ) 在数据库中插入具有相同字段名称的多个字段数据
- android - 无法获取 kotlin-dsl 插件 3.6
- python - 如何在 python 脚本中使用 shell 变量
- javascript - 如何让 getBBox 忽略剪裁的 svg 元素
- c# - 在 C# 中重构异步套接字编程
- wpf - 尝试在文本块 WPF 中换行和缩放文本