DevCN
菜单
全部文章快讯开发科技深度热点

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 是范围错误,尾随空白按本契约是格式错误。如果需要允许空白,先清洗再解析并补相应测试。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。