2010-11-30 8 views
2

Par curiosité, pourquoi est-ce que je reçois un IllegalArgumentException pour le MONTH dans le cas de test ci-dessous?Java Date de bizarrerie

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

Je regardais les GregorianCalendar qui est la valeur par défaut sur mon système, et se rendre compte que le champ MONTH serait en effet le premier à différer dans les deux 30 février, contre 2 Mars dans ce cas, mais shouldn 't ce IllegalArgumentException être ce qui provoque le débordement, ou était-il simplement considéré comme difficile à "découvrir"?

Répondre

8

Parce que Février a toujours moins de 30 jours. Et vous définissez le jour sur l'instance Calendar à 30. Ainsi, lorsque vous essayez de créer un Date non valide, Java ne vous laissera pas parce que ce serait une date non valide et que vous avez choisi setLienient(false).

les opérations suivantes:

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

Cela devrait fonctionner.

Cela est finalement causé parce que vous appelez c.setLenient(false);. Cela rend Java strict quant aux dates permises.

Voir la Javadoc pour la méthode:

public void setLenient(boolean lenient)

+0

+1 pour la réponse liée non programmation. holla –

+0

@Carlo, merci. Il est légèrement lié à la programmation. – jjnguy

+1

... ou 29 jours - mais vous ne savez pas ce qui se passe avant la fin de l'année. –