8
votes

Pourquoi est-ce que je reçois une parseException lors de l'utilisation de SimpleDateFormat pour formater une date, puis d'analyser?

J'ai débogué du code existant pour lequel des tests d'unités échouent sur mon système, mais pas sur les systèmes de collègues. La cause fondamentale est que SimpleDateDeformat lance des décomptions parsexes lors de l'analyse des dates qui devraient être analysées. J'ai créé un test unitaire qui démontre le code qui échoue sur mon système: xxx pré>

Ce test jette une perserrexception sur mon système, mais fonctionne avec succès sur d'autres systèmes. P>

java.text.ParseException: Unparseable date: "20100603100243.118 -0600"
    at java.text.DateFormat.parse(DateFormat.java:352)
    at FormatsTest.testParse(FormatsTest.java:16)


7 commentaires

Je ne suis pas sûr, mais pouvez-vous aussi vérifier le fuseau horaire? Je pense que le fuseau horaire peut être basé sur le système, non?


J'ai mis à jour ma classe de test et la trace de pile dans le message d'origine pour supprimer la nommage liée à l'application que j'ai trouvée le bogue dans. Le code a été copié et collé de mon éditeur au navigateur; La seule édition consistait à indenter le code par quatre espaces, comme requis par le débordement de la pile. De même avec la trace de la pile, bien que je retire les lignes de la trace de pile qui sont des appels dans le faisceau de test de test. Je peux ajouter ceux-ci si vous souhaitez les voir.


Quelles versions de la JDK utilisez-vous pour compiler et quelle version de la JRE utilisez-vous ces informations? C'est probablement la question probable.


@Fuzzy je ne pense pas. Comment fonctionner format.parse (format.format (nouvelle date (date ())) serait possible jeter pareseexception dans ce qui est en cours d'exécution?


J'utilise Rational Application Developer 7 pour compiler et exécuter les tests. Le projet que je travaille sur Targets WebSphere 6.1, j'exécute les tests de l'IBM JRE associé à celui-ci: IBM J9 VM (Build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows X86-32 J9VMWI3223-20060504 (JIT activé) . C'est le même JRE que le reste de l'équipe utilise pour exécuter ce même test et le test réussit sur les autres machines. J'ai juste essayé d'exécuter le test avec un Sun Java 6 Jre (1.6.0_20), et le test court avec succès. Je ne suis pas sûr de quoi faire de cela.


VOTRE ENVIRONNEMENT N'EST PAS CE QUE VOUS PENSEZ N'EST PAS L'EST D'une part, c'est-à-dire que mon point de demander la version JDK / JRE. J'ai récemment eu des tests unitaires qui ont itéré sur une pause de carte lorsqu'ils couraient contre Java 6, ils ont changé d'itération de Keyset () sous les couvertures de 1,5 à 6.


@Fuzzy Lollipop C'est pourquoi vous ne comptez pas sur l'ordre d'itération de tout ce qui ne spécifie pas son ordre d'itération.


3 Réponses :


6
votes

- - édité après la réponse indiquant que le développeur utilise la machine virtuelle J9 1.5.0 J9 de l'IBM ---

J9 JVM de IBM semble avoir quelques bugs et incompatibilités dans la routine d'analyse de DateFormat, qui simplifie hérite parce que c'est une sous-classe de dateformat. Certaines preuves permettant de soutenir que le J9 d'IBM ne fonctionne pas tout à fait la façon dont vous pouvez vous attendre à ce que d'autres JVMS (comme Hotspot JVM de Sun) puissent être visibles ICI .

Notez que ces bugs et incompétibilites ne sont même pas cohérents dans le J9 JVM, en d'autres termes, la logique de formatage IBM J9 pourrait réellement générer des temps formatés qui ne sont pas Compatible avec la logique d'analyse IBM J9.

Il semble que les personnes attachées à J9 JVM de IBM ont tendance à contourner le bogue dans le JVM en n'utilisant pas DateFormat.Parse (...) (ou SimpleDateDeformat. analyser (...)). Au lieu de cela, ils ont tendance à utiliser java.util.regex.matcher pour analyser les champs manuellement.

Peut-être une version ultérieure du J9 JVM fixe la question, peut-être pas.

- - L'article original suit ---

drôle, le même code modifié à: xxx

fonctionne bien sur mon système. Je parierais que c'est quelque chose dans votre environnement. Soit vous compilez le code sur une version majeure JVM et l'exécuter sur un autre (qui peut entraîner des problèmes, car les bibliothèques pouvaient être obsolètes) ou le système que vous utilisez sur peut-être rapporter des informations sur le fuseau horaire curieusement.

Enfin, vous voudrez peut-être envisager si vous utilisez une version très précoce de la JVM. Parfois, les bugs se glissent dans les différentes versions et sont fixés dans des versions de points ultérieures. Pourriez-vous s'il vous plaît modifier votre question pour inclure les informations "java -verion" pour votre système?

de toute façon, ces deux ne sont que des suppositions éduquées. Le code devrait fonctionner comme écrit.


6 commentaires

Java version "1.6.0_17" environnement d'exécution OpenJDK (ICEDTEA 1.7.1) (Fedora-37.b17.fc12-x86_64) OpenJDK 64 bit Server VM (Build 14.0-B16, Mode mixte)


Je reçois: 20100603101026.294 -0600 Exception dans le fil "Main" Java.Text.ParseXception: Date non imparable: "20100603101026.294 -0600" à java.text.dateformat.parse (dateformat.java:352) au formatStest.tsparts.java: 15) au formatStestest.main (formatestest.java:20) Utilisation: Java Version "1.5.0" Java (TM) 2 Environnement d'exécution, édition standard (Build pwi32Dev-20060511 (SR2)) IBM J9 VM (Build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 J9VMWI3223-2006050 4 (JIT activé) J9VM - 20060501_06428_LDDSMR JIT - 20060428_1800_R8 GC - 20060501_AA) JCL - 20060511A


Je suppose que c'est la même configuration que votre environnement de production a?


Original Post Modifié, le problème n'est probablement pas sur le côté du compilateur des choses, mais dans la classe Java.Util.DateFormat de la version IBM J9 de la bibliothèque Java standard.


BTW, je conviens que le code devrait fonctionner comme écrit et travaille en fait comme écrit sur d'autres ordinateurs que je l'exécute.


@Greg content de l'entendre. C'est assez rare que la plate-forme Java ait un bogue comme celui-ci, mais tout est écrit par des humains et que les erreurs éventuellement sont faites. Bienvenue sur votre premier bogue de plate-forme Java. Soulevez un problème avec IBM, ils pourraient déjà avoir une solution. Sinon, vous pouvez peut-être répondre à vos objectifs en désactivant temporairement le test de l'unité pendant que vous déterminez s'il vaut la peine d'obtenir les systèmes affectés migrés vers une JVM non affectée.