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
相关产品推荐
相关产品推荐

