You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中SimpleDateFormat异常处理:新手如何实现dd-MM-yyyy格式校验并抛异常

嘿,我来帮你搞定这个日期校验的需求~你的思路方向是对的,但代码里有几个小问题需要调整,我一步步给你讲清楚:

先说说你现有代码的问题
  • this.Day = tag; 这明显是笔误啦,应该改成 this.Day = day;(不过建议成员变量用小驼峰命名,比如day而不是Day,符合Java编码规范)
  • 直接把day和SimpleDateFormat实例做比较是完全错误的逻辑——SimpleDateFormat是用来格式化/解析日期字符串的工具类,不能直接和整数类型的日进行对比
  • 另外注意:Java自带了java.util.Date类,如果你自己的类也叫Date很容易混淆,建议改成MyDate或者CustomDate这类自定义名称
正确的实现方案

我们的核心需求是:验证输入的日、月、年能否组成符合dd-MM-yyyy格式的合法日期,非法则抛出异常。下面给你两种实现方式,分别适配不同的Java版本:

方式1:用SimpleDateFormat(兼容Java 8之前的版本)

import java.text.ParseException;
import java.text.SimpleDateFormat;

// 自定义日期类,避免和Java自带的Date冲突
public class MyDate {
    private int day;
    private int month;
    private int year;

    public MyDate(int day, int month, int year) {
        // 把输入的日、月、年拼接成dd-MM-yyyy格式的字符串
        String dateStr = String.format("%02d-%02d-%04d", day, month, year);
        SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy");
        
        // 开启严格校验模式:禁止自动修正非法日期(比如2024-02-30这类不存在的日期)
        dateFormatter.setLenient(false);

        try {
            // 尝试解析字符串,非法日期会直接抛出ParseException
            dateFormatter.parse(dateStr);
            // 解析成功,说明日期合法,赋值给成员变量
            this.day = day;
            this.month = month;
            this.year = year;
        } catch (ParseException e) {
            // 解析失败,抛出参数非法异常,附带错误信息
            throw new IllegalArgumentException("输入的日期非法,请符合dd-MM-yyyy格式且为真实存在的日期,错误详情:" + e.getMessage());
        }
    }

    // 可以添加getter方法方便外部获取日期字段
    public int getDay() {
        return day;
    }

    public int getMonth() {
        return month;
    }

    public int getYear() {
        return year;
    }
}

方式2:用Java 8+的新日期API(推荐)

Java 8之后推出的java.time包是线程安全、设计更合理的日期工具,推荐优先使用:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class MyDate {
    private int day;
    private int month;
    private int year;

    public MyDate(int day, int month, int year) {
        String dateStr = String.format("%02d-%02d-%04d", day, month, year);
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

        try {
            // 解析日期字符串,默认就是严格校验模式
            LocalDate validDate = LocalDate.parse(dateStr, dateFormatter);
            // 额外校验:确保解析后的日期和输入的完全一致(避免极端场景下的自动修正)
            if (validDate.getDayOfMonth() != day || validDate.getMonthValue() != month || validDate.getYear() != year) {
                throw new IllegalArgumentException("输入的日期不存在");
            }
            // 日期合法,完成赋值
            this.day = day;
            this.month = month;
            this.year = year;
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("输入的日期非法,请符合dd-MM-yyyy格式且为真实存在的日期,错误详情:" + e.getMessage());
        }
    }

    // getter方法
    public int getDay() {
        return day;
    }

    public int getMonth() {
        return month;
    }

    public int getYear() {
        return year;
    }
}
关键知识点说明
  • 严格校验:不管用哪种方式,都要确保开启严格校验模式,避免工具类自动把非法日期(比如2023-02-29)修正为合法日期,这样才能准确抛出异常
  • 异常选择:这里用IllegalArgumentException是最合适的,这是Java标准的运行时异常,专门用于处理参数非法的场景
  • 编码规范:成员变量建议用小驼峰命名(比如day而非Day),这是Java社区通用的编码风格,能让代码更易读

内容的提问来源于stack exchange,提问作者Dominic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:55:37