Java的。限制日期的值

时间:2013-04-07 19:56:37

标签: java exception date int restrict

这对你们来说似乎是一个愚蠢的问题,但我是一个java菜鸟,仍然试图掌握整个概念。 所以,我基本上有一个简单的影院管理系统,允许我添加组到数据库。对于每个组,您可以添加每个具有唯一学生ID和姓名的学生。您还可以向组中添加排练日期。这两者都存储在单独的链表中。 这是我的排练对象:

public Rehearsal(int d, int m, int y) {
    day = d;
    month = m;
    year = y;
}

这是组类中的addRehearsal方法:

public void addRehearsal(int d, int m, int y) {
    Rehearsal newrehearsal = new Rehearsal(d, m, y);
    if (!RehearsalDates.contains(newrehearsal)) {
        RehearsalDates.add(newrehearsal);
    }
    else
        JOptionPane.showMessageDialog(null, "Rehearsal already exists for this group!", "Error", JOptionPane.WARNING_MESSAGE);
}

我的问题是,如何以及在何处限制可以输入的值。这意味着,如果为int d>输入的值,程序会以消息对话框的形式给出错误。 31或者int m> 12.这一年并不是必需的,因为允许用户创建过去和未来的排练日期。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

验证日期比检查每个参数更复杂。例如,使用(29, 2, 2000)调用它将无效(回想一下,2000年不是闰年),即使所有参数都在"范围内"。

唯一合理的检查方法是尝试从参数中解析Date并捕获异常。有几种方法可以做到这一点,但最简单的是:

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
    }
    // rest of code
}

请注意setLenient()的调用,这是必需的,否则无效输入"翻转"到下一个可用的有效日期 - 例如36-12-2012将被解析为05-01-2013

放置此代码的最佳位置是在构造函数中,抛出异常:

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
        throw new IllegalArgumentException();
    }
    day = d;
    month = m;
    year = y;
}

你可以在任何地方看到它。

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}
// rest of method

更好的设计是传递Date对象,将调用函数放在调用者身上以验证输入,并且会有更少的throw和catch代码。

答案 1 :(得分:0)

为什么不从IllegalArgumentException的构造函数中抛出Rehearsal,然后在addRehearsal方法中捕获它:

public Rehearsal(int d, int m, int y) {
    if (d < 1 || d > 31) {
        throw new IllegalArgumentException("Invalid day");
    }
    if (m < 1 || m > 12) {
        throw new IllegalArgumentException("Invalid month");
    }
    day = d;
    month = m;
    year = y;
}

addRehearsal方法中捕获构造上的异常:

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}

这应该是一个中间解决方案 - 它肯定会阻止创建无效日期。

然后,您可能希望稍后在输入上添加侦听器,以防止首先出现无效数据。

最后,您可能需要考虑使用Calendar而不是自定义日期对象。