Java MyDate类日期验证问题:天数>29时判定失效求助
日期验证逻辑错误修复方案
问题根源分析
你的代码出现"日数超过29即判定无效"的问题,核心是这几个错误:
- 数组转List的逻辑错误:
Arrays.asList(m31)处理int[]数组时,生成的是包含单个数组元素的List<int[]>,而非预期的List<Integer>,导致contains(m)永远返回false,31天月份的判断完全失效。 - 2月判断未限定月份:闰年/非闰年的天数判断没有限制必须是2月,其他月份的日期只要日数>29,就会走到这个分支并被拒绝。
- 闰年判断不严谨:仅用
y%4==0判断闰年不符合标准规则,遗漏了"能被100整除但不能被400整除的年份不是闰年"的情况(比如1900年)。 - 缺少基础边界校验:没有判断月份是否在1-12之间、日期是否≥1,这些都会导致无效日期漏判。
修复后的完整代码
import java.util.*; class InvalidDateException extends Exception {} class MyDate { int day, month, year; void accept() { try (Scanner s = new Scanner(System.in)) { // 自动关闭Scanner int d, m, y; System.out.println("Enter day (Example: 12 25 30):"); d = s.nextInt(); System.out.println("Enter month (Example: 2 6 12):"); m = s.nextInt(); System.out.println("Enter year (Example: 2012 2025 1930):"); y = s.nextInt(); if (valid(d, m, y)) { day = d; month = m; year = y; } else { throw new InvalidDateException(); } } catch (InvalidDateException e) { // 仅捕获自定义异常 System.out.println("InvalidDateException"); } catch (InputMismatchException e) { System.out.println("请输入整数格式的日期"); } } boolean valid(int d, int m, int y) { // 用HashSet存月份,判断更高效 Set<Integer> monthsWith31Days = new HashSet<>(Arrays.asList(1, 3, 5, 7, 8, 10, 12)); Set<Integer> monthsWith30Days = new HashSet<>(Arrays.asList(4, 6, 9, 11)); // 基础边界校验 if (m < 1 || m > 12) return false; if (d < 1) return false; // 分月份判断天数 if (monthsWith31Days.contains(m)) { return d <= 31; } else if (monthsWith30Days.contains(m)) { return d <= 30; } else { // 仅处理2月的情况 boolean isLeapYear = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); return isLeapYear ? d <= 29 : d <= 28; } } void display() { System.out.println("DAY-MONTH-YEAR :: " + day + "-" + month + "-" + year); } } class Main { public static void main(String args[]) { MyDate date = new MyDate(); date.accept(); date.display(); } }
关键修改说明
- 替换数组为HashSet:避免数组转List的错误,同时提高月份判断的效率。
- 增加基础边界校验:确保月份在1-12、日期≥1,覆盖更多无效场景。
- 限定2月判断分支:只有当月份是2时才进入闰年判断,其他月份不会走到这个逻辑。
- 完善闰年规则:遵循国际标准的闰年判断逻辑,避免误判1900这类年份。
- 优化异常处理:只捕获自定义异常和输入格式异常,避免捕获所有异常导致调试困难,同时用try-with-resources自动关闭Scanner。
内容的提问来源于stack exchange,提问作者02 Ankesh Agarwal
相关产品推荐
相关产品推荐

