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

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();
    }
}

关键修改说明

  1. 替换数组为HashSet:避免数组转List的错误,同时提高月份判断的效率。
  2. 增加基础边界校验:确保月份在1-12、日期≥1,覆盖更多无效场景。
  3. 限定2月判断分支:只有当月份是2时才进入闰年判断,其他月份不会走到这个逻辑。
  4. 完善闰年规则:遵循国际标准的闰年判断逻辑,避免误判1900这类年份。
  5. 优化异常处理:只捕获自定义异常和输入格式异常,避免捕获所有异常导致调试困难,同时用try-with-resources自动关闭Scanner。

内容的提问来源于stack exchange,提问作者02 Ankesh Agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:40:39