出于好奇,我为什么会在以下测试用例中收到IllegalArgumentException
的{{1}}?
MONTH
我查看了GregorianCalendar,它是我系统的默认值,并且意识到public class Testing {
public static void main(String args[]) {
Calendar c = Calendar.getInstance(Locale.getDefault());
c.setLenient(false);
Date d = new Date();
c.set(Calendar.MONTH, Calendar.FEBRUARY);
c.set(Calendar.DAY_OF_MONTH, 30);
c.set(Calendar.YEAR, 2010);
d = c.getTime(); //Exception is not thrown until this line
System.out.println(d.toString());
}
}
字段实际上是第一个在2月30日与3月2日相比有所不同的字段,但是不应该这个MONTH
是导致溢出的原因,还是仅仅被认为难以“发现”?
答案 0 :(得分:8)
因为二月总是少于30天。并且您将Calendar
实例上的日期设置为30.因此,当您尝试创建无效的Date
时,Java将不会让您,因为这将是无效日期并且您已选择{{ 1}}。
尝试以下方法:
setLienient(false)
这应该有效。
这最终是因为您正在呼叫c.set(Calendar.DAY_OF_MONTH, 28);
c.set(Calendar.MONTH, Calendar.FEBRUARY);
c.set(Calendar.YEAR, 2010);
而导致的。这导致Java对它允许的日期严格。
请参阅Javadoc获取方法: