Les Causes de l'obtention d'un java.lang.Exception verifyerror
Je recherche la suite de java.lang.VerifyError
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
Il se produit lorsque le serveur jboss dans lequel la servlet est déployé est commencé.
Il est compilé avec jdk-1.5.0_11 et j'ai essayé de recompiler avec jdk-1.5.0_15 sans succès. C'est la compilation se passe bien, mais lorsqu'il est déployé, le java.lang.Exception verifyerror se produit.
Quand j'ai changé le nom de la méthode et j'ai obtenu le message d'erreur suivant:
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
Vous pouvez voir que plus de la signature de la méthode est illustré.
La véritable signature de la méthode est
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
J'ai déjà essayé de regarder avec javap
et qui donne à la signature de la méthode comme il se doit.
Lors de mes autres collègues de vérifier le code, le compiler et de le déployer, ils ont le même problème. Lorsque le serveur de build prend le code et le déploie sur le développement ou d'environnements de tests (hp-ux), la même erreur se produit. Aussi un système automatisé de machine d'essai d'Ubuntu affiche le même message d'erreur lors du démarrage du serveur.
Le reste de l'application fonctionne bien, seulement que l'un servlet est hors d'ordre.
Toute idée où chercher serait utile.
- Je l'ai eu à partir de la version incorrecte de ComparisonFailure. A pris une ÉTERNITÉ à trouver...c'est pénible
- Je l'ai eu lors de l'utilisation instantanée exécuter dans Android studio (hotswapping sur la compilation). De l'éteindre a fait le travail.
Vous devez vous connecter pour publier un commentaire.
java.lang.VerifyError
peut être le résultat si vous avez compilé à l'encontre d'une autre bibliothèque que vous utilisez au moment de l'exécution.Par exemple, ce qui m'est arrivé lorsque vous essayez d'exécuter un programme qui a été compilé avec Xerces 1, mais Xerces 2 a été trouvé sur le chemin de la classe. Les classes nécessaires (en
org.apache.*
espace de noms) ont été trouvés au moment de l'exécution, de sorteClassNotFoundException
était pas le résultat. Il y a eu des changements sur les classes et les méthodes, ainsi que les signatures de méthode trouvé lors de l'exécution ne correspond pas à ce qui était là au moment de la compilation.Normalement, le compilateur signalera les problèmes où la méthode signatures ne correspondent pas. La JVM va vérifier le bytecode de nouveau lorsque la classe est chargée, et le jette
VerifyError
lorsque le bytecode est en train de faire quelque chose qui ne devrait pas être autorisée, par exemple, l'appel d'une méthode qui retourneString
et puis stocke cette valeur dans un champ qui est titulaire d'unList
.-verbose:class
et ensuite chercher la classe, juste avant qu'il se chargejava.lang.VerifyError
. Ce sera le chemin vers le BOCAL. Utilisationjavap
et de la comparer à la classe en cours de compilation contre. J'ai trouvé ce utile que la classe qui a été signalé dans l'erreur n'était pas la cause, il a été en fait l'un des arguments.java.lang.VerifyError
sont les pires.Vous obtenez cette erreur si le bytecode de la taille de votre méthode dépasse la limite de 64 ko; mais vous auriez sans doute remarqué qu'.
Êtes-vous sûr à 100% de cette classe n'est pas présent dans le classpath ailleurs, dans votre application, peut-être dans un autre pot?
Aussi, à partir de votre stacktrace, est l'encodage du fichier source (
utf-8
?) Est-ce exact?Que Kevin Panko dit, c'est principalement en raison de la bibliothèque de changement.
Ainsi, dans certains cas, un "nettoyage" du projet (répertoire), suivie par une accumulation fait le tour.
J'ai corrigé cette erreur sur Android en faisant le projet m'a de l'importation d'une bibliothèque, comme décrit ici http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
Auparavant, j'étais juste de référencement sur le projet (ne pas en faire une bibliothèque) et j'avais cette étrange exception verifyerror.
Espère que cela aide quelqu'un.
Une chose que vous pourriez faire est d'essayer en utilisant
-Xverify:all
qui permettra de vérifier le bytecode de la charge et donne parfois des messages d'erreur utiles si le pseudo-code est invalide.Exception verifyerror signifie que le fichier de classe contient le bytecode qui est syntaxiquement correct, mais viole certains sémantique restriction par exemple un saut de cible qui traverse la méthode des limites.
Fondamentalement, une exception verifyerror ne peut se produire lorsqu'il y a un bogue du compilateur, ou lorsque la classe fichier est endommagé d'une autre manière (par exemple, par le biais de RAM défectueuse ou l'échec de la HD).
Essayez de compiler avec une autre version du JDK et sur une autre machine.
Dans mon cas, mon projet Android dépend d'un autre projet Java compilé pour Java 7.
java.lang.VerifyError
a disparu après que j'ai changé Compilateur Niveau de Conformité de ce projet Java à 6,0Plus tard, j'ai découvert que c'est un Dalvik question: https://groups.google.com/forum/?fromgroups#!topic/android-développeurs/sKsMTZ42pwE
Je recevais ce problème en raison de pack200 déformation d'un fichier de classe. Un peu de recherche tourné cette bug de java jusqu'. Fondamentalement, le réglage de
--effort=4
a causé le problème de s'en aller.À l'aide de java 1.5.0_17 (bien qu'il a surgi dans chaque variante de java 1.5 je l'ai essayé dans).
J'ai fixé un semblable java.lang.Exception verifyerror problème en remplaçant
avec
où
MagickException
a été défini dans un projet de bibliothèque (sur lequel mon projet a un lien de dépendance).Après que j'ai eu une
java.lang.NoClassDefFoundError
à propos d'une classe de la même bibliothèque (fixe selon https://stackoverflow.com/a/9898820/755804 ).Cela peut se produire sur Android lorsque vous essayez de charger une bibliothèque qui a été compilé avec Oracle JDK.
Là est le problème pour Ning Asynchrone client HTTP.
Dans mon cas, j'ai dû enlever ce bloc:
Il montrait d'erreur près
Fragment.showDialog()
appel de méthode.Exemple Minimal qui génère l'erreur
Une simple possibilité est d'utiliser Jasmin, ou modifier manuellement le bytecode avec un éditeur de fichier binaire.
Permet de créer
void
méthode sansreturn
instruction (généré par lereturn;
déclaration en Java), dont la JVM dit est illégal.De Jasmin nous pourrions écrire:
Nous avons ensuite faire
javac Main.j
etjavap -v Main
dit que nous avons compilé:de sorte vraiment il n'y a aucune instruction de retour.
Maintenant, si nous essayons d'exécuter
java Main
nous obtenons:Cette erreur ne peut jamais se produire en Java normalement, puisque le compilateur Java ajoute un implicite
return
àvoid
méthodes pour nous. C'est pourquoi nous n'avons pas besoin d'ajouter unreturn
à notremain
méthodes. Vous pouvez le vérifier avecjavap
.JVM
Exception verifyerror se produit lorsque vous essayez d'exécuter certains types d'illégal fichier de classe comme spécifié par JVM 7 chapitre 4.5
La JVM dit que quand Java charge un fichier, il doit exécuter une série de vérifications pour voir que le fichier de classe est OK avant de l'exécuter.
De telles erreurs ne peut pas être produite sur un seul compiler et exécuter le cycle de code Java, parce que JVM 7 4.10 dit:
Donc, pour voir un minimum de défaillance exemple, nous aurons besoin de générer le code source sans
javac
.Cette page peut vous donner quelques conseils -
http://www.zanthan.com/itymbi/archives/000337.html
Il y a peut être un bug subtil dans le corps de cette méthode que l'javac ne parvient pas à repérer. Difficile à diagnostiquer, à moins que vous validez l'ensemble de la méthode ici.
Vous pourriez commencer par déclarer autant de variables que possible, comme le final... qui aurait pris le bug mentionné sur le zanthan site, et est souvent une bonne pratique de toute façon.
Bien dans mon cas, mon projet a avait une dépendance à une autre, par exemple X(a l'aide de certaines classes définies dans X). Alors, quand j'ai ajouté le X comme un projet de référence dans le build path de Un , j'ai eu cette erreur. Cependant, quand je l'ai enlevé X que le projet référencé et inclus X bocal comme l'une des bibliothèques, le problème a été résolu.
Vérifier plusieurs versions d'un même fichier jar sur votre classpath.
Par exemple, j'ai eu opennlp-tools-1.3.0.jar et opennlp-tools-1.5.3.jar sur mon chemin de classe et a obtenu cette erreur. La solution a été de supprimer opennlp-tools-1.3.0.jar.
CGLIB < 2.2 avec le JRE > 6 pourrait déclencher des erreurs similaires, voir "Dois-je mettre à niveau vers CGLIB 3.0?" et quelques commentaires à Printemps SPR-9669.
Cela est particulièrement vrai lorsque tout fonctionne bien sur les JRE 6 et simplement en changeant de JRE7 sauts de choses.
Une autre raison de cette erreur peut être la combinaison d'AspectJ <= 1.6.11 avec le JRE > 6.
Voir Eclipse Bug 353467 et Kieker billet 307 pour plus de détails.
Cela est particulièrement vrai lorsque tout fonctionne bien sur les JRE 6 et le déplacement à JRE7 sauts de choses.
Il peut également se produire lorsque vous avez beaucoup de module importations avec maven.
Il y aura deux classes ou plus ayant exactement le même nom ( même nom qualifié).
Cette erreur résulte de la différence d'interprétation entre les temps de compilation et d'exécution.
Si vous migrez vers java7 ou à l'aide de java7, généralement, cette erreur peut être vu. Je confrontés erreurs ci-dessus et eu beaucoup de mal à trouver la cause racine, je suggère d'essayer d'ajouter "-XX:-UseSplitVerifier" argument JVM lors de l'exécution de votre application.
Si la raison invoquée par Kevin est correct, mais j'aurais certainement vérifier ci-dessous avant de passer à autre chose:
cglibs
dans mon classpath.hibernate
versions dans mon classpath.Les Chances sont bonnes que le fait d'avoir plusieurs ou conflit de version de tout ce qui précède pourrait causer des problèmes inattendus, comme celui en question.
java.lang.Exception verifyerror signifie que votre code compilé est en se référant à quelque chose qu'Android ne peut pas trouver. Cette exception verifyerror Questions-moi seulement avec kitkat4.4 et moins version pas dans la version ci-dessus, même que j'ai couru à la même construction dans les deux Appareils. lorsque j'ai utilisé jackson json analyseur de l'ancienne version, il montre de java.lang.exception verifyerror
Puis j'ai changé la Dépendance à la dernière version 2.2 à 2.7 sans bibliothèque de base, puis il travaille. ce qui signifie que les Méthodes et contenus de de base est migré vers la dernière version de Databind2.7. Ce correctif mes Questions.
veuillez supprimer toute inutilisable fichier jar et essayez de les exécuter. et son travail pour moi, j'ai ajouté un jcommons fichier jar et aussi un autre jcommons.1.0.14 fichier jar afin de supprimer jcommons et sa fonctionne pour moi
Dans mon cas, j'ai été faire vérifier l'erreur ci-dessous trace de la pile
Je l'ai résolu en supprimant classpath pour commons-codec-1.3.jar, il y avait une incompatibilité de version de ce pot avec le one est livré avec Jasper.