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: 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)
3 Réponses :
- - é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 . P>
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. P>
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. P>
Peut-être une version ultérieure du J9 JVM fixe la question, peut-être pas. P>
- - L'article original suit --- p>
drôle, le même code modifié à: p> 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. P> 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? P> de toute façon, ces deux ne sont que des suppositions éduquées. Le code devrait fonctionner comme écrit. P> p>
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) Code> 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.
Cela devrait probablement être un bogue dans J9 VM d'IBM sur la classe SimpleDateFormat. p>
Cet article montre un problème similaire, et dit Il devrait être fixé sur V6. P>
Vous pouvez trouver la liste des modifications de plusieurs sorties ici a>. p>
Je vois qu'il y a un numéro lié à DateFormat. Donc, vous devriez probablement soulever un rapport de bogue ou quelque chose avec IBM pour vous donner un patch. p>
BTW, à propos de ces autres ordinateurs, utilisez-ils la même configuration que le vôtre? (Probablement quelqu'un a installé JDK de Sun sur son ordinateur et c'est pourquoi ça va bien)
J'ai vérifié et certaines personnes ont un plus récent IBM JVM que moi, mais ils utilisent tous l'IBM JVM. Je vais essayer de passer pour voir si elle corrige le problème.
Vérifiez la variable d'environnement LANG de votre ordinateur et de l'ordinateur distant. P>
La date est analysée selon les paramètres régionaux, de sorte que "juillet" fonctionne comme juillet uniquement si votre langage est défini sur l'anglais, sinon une décomption de parseException est soulevée. P>
Vous pouvez effectuer un test rapide en exécutant Vous pouvez également définir la locale par programme, en utilisant la méthode suivante:
Dateformat.getdateinstance (int, java.util.locale) p> export Lang = "EN_US.UTF-8" code> puis exécutez votre programme. P>
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 ())) code> 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.