Java 异常处理:区分分钟数格式错误和范围错误
将文本解析与业务范围验证分开,按异常类型报告失败,并让一条坏输入不阻止整批后续记录处理。
本节目标
将文本解析与业务范围验证分开,按异常类型报告失败,并让一条坏输入不阻止整批后续记录处理。
环境与运行方法
准备 JDK 21。保存为 Lesson.java,执行 javac -Xlint:all Lesson.java,再执行 java Lesson。文件名与 public 类名一致,运行时使用类名而不是 .class 文件名。
核心思路
Integer.parseInt 检查整数表示,但合法整数不一定符合一天时长的业务范围。函数先解析再检查 0 到 1440;调用方逐条捕获,保留每条输入的处理结果。
完整示例
public class Lesson {
static int minutes(String text) {
int value = Integer.parseInt(text);
if (value < 0 || value > 1440) throw new IllegalArgumentException("range");
return value;
}
public static void main(String[] args) {
for (String text : new String[]{"45", "x", "1441", "0"}) {
try { System.out.println("ok=" + minutes(text)); }
catch (NumberFormatException error) { System.out.println("error=format"); }
catch (IllegalArgumentException error) { System.out.println("error=range"); }
}
}
}预期输出
ok=45
error=format
error=range
ok=0逐步理解
NumberFormatException 是 IllegalArgumentException 的子类,更具体的异常要在前面捕获。宽泛分支放在前面会使分类无效,并可能产生不可达分支编译错误。
本例没有自动清理首尾空白。是否允许空白应该写在输入协议中,然后增加 strip 等明确处理。不要把错误统一改成零,因为零分钟本来就是合法数据。
常见问题与边界
- 捕获顺序从具体到一般。
- 解析范围不等于业务范围。
- 空 catch 会让导入失败不可追踪。
动手练习
增加 "1440"、"-1" 与 "45 "。
参考答案
1440 合法,-1 是范围错误,尾随空白按本契约是格式错误。如果需要允许空白,先清洗再解析并补相应测试。
文章回复
0 条公开回复