




Java评分逻辑应优先用if-else配合左闭右开边界(如score>=90)处理分数等级,统一阈值为常量,校验非法输入(NaN、无穷、越界),避免浮点误差与硬编码。
Java 里最直接的评分逻辑就是根据数值范围输出对应等级,比如 90–100 是 A,80–89 是 B。关键不是“怎么写分支”,而是**边界值处理是否一致**——score >= 90 和 score > 89 表面等价,但遇到浮点输入或未来扩展小数评分时行为可能不同。
推荐统一用“左闭右开”习惯(如 score >= 90 && score ),避免漏掉满分或重复覆盖:
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else if (score >= 60) {
grade = "D";
} else {
grade = "F";
}
== 判断分数段(比如 score == 95),这不适用于区间判定score 是 double 或 int,避免传入 null 导致 NullPointerException
Java 14 起支持 switch 表达式配合模式匹配,但注意:它**不能直接对区间做 case**,必须先将分数转为离散等级码(比如用 (int) score / 10 得到 0–10 的整数)。
适合分数严格为整数、且分档规则是 10 分一档的场景:
int band = Math.max(0, Math.min(10, (int) score / 10)); // 限定在 0–10
String grade = switch (band) {
case 10 -> "A"; // 100–109(实际只会到100)
case 9 -> "A"; // 90–99
case 8 -> "B"; // 80–89
case 7 -> "C"; // 70–79
case 6 -> "D"; // 60–69
default -> "F"; // 0–59
};
Math.max/min 防止 band 越界,否则 switch 会抛 IllegalArgumentException
error: switch expressions are not supported
真实项目中,评分逻辑不会裸写在 main 里,而应封装为独立方法,重点在于**提前拦截坏数据**,而不是让调用方承担校验责任。
典型错误是忽略 Double.NaN、无穷大或非数字字符串转换失败:
public static String getGrade(double score) {
if (Double.isNaN(score) || Double.isInfinite(score)) {
throw new IllegalArgumentException("Score must be a valid finite number");
}
if (score < 0 || score > 100) {
throw new IllegalArgumentException("Score must be between 0 and 100");
}
// ... 后续 if-else 判断
}
IllegalArgumentException 比 RuntimeException 更明确"N/A" 或 null,但需在 Javadoc 明确说明把 90、80 这类数字直接写死在 if 条件里,后续调整分级标准(比如 B 线从 80 改成 82)就得改多处,极易遗漏。
用静态常量或配置化方式管理阈值:
private static final double A_MIN = 90.0; private static final double B_MIN = 80.0; private static final double C_MIN = 70.0; private static final double D_MIN = 60.0; if (score >= A_MIN) grade = "A"; else if (score >= B_MIN) grade = "B"; // ...
A_MIN 比 THRESHOLD_1 好懂)score >= 80.0 安全,但避免 score == 80.0 判定临界点边界条件永远比主流程更易出错,比如刚好 60.0 分该算 D 还是 F、用户输了个空字符串转成
