这对你们来说似乎是一个愚蠢的问题,但我是一个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.这一年并不是必需的,因为允许用户创建过去和未来的排练日期。
感谢您的帮助:)
答案 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
而不是自定义日期对象。