2010-11-30 59 views
2

出於好奇,爲什麼我會在MONTH下面的測試用例中收到IllegalArgumentExceptionJava日期奇數

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

我看着GregorianCalendar的是我的系統上的默認,並認識到MONTH場實際上將兩個2月30日在此情況下不同,VS 3月2日的第一個,但不該這個IllegalArgumentException是導致溢出的原因,還是被認爲很難「發現」?

回答

8

因爲2月總是少於30天。並且您將Calendar實例的一天設置爲30.因此,當您嘗試創建無效的Date時,Java不會允許您,因爲那將是無效日期,並且您選擇了setLienient(false)

嘗試以下操作:

c.set(Calendar.DAY_OF_MONTH, 28); 
c.set(Calendar.MONTH, Calendar.FEBRUARY); 
c.set(Calendar.YEAR, 2010); 

這應該工作。

這最終是由於您致電c.setLenient(false);而引起的。這導致Java嚴格限制它允許的日期。

見的Javadoc方法:

public void setLenient(boolean lenient)

+0

+1的非編程相關的答案。霍拉 – 2010-11-30 20:08:28