204 votes

Comment corriger une erreur NoSuchMethodError ?

Je reçois un NoSuchMethodError lors de l'exécution de mon programme Java. Qu'est-ce qui ne va pas et comment puis-je y remédier ?

13 votes

Dans Netbeans : Faites un clic droit sur le projet dans l'onglet Projets, utilisez "Clean and Build". Cela a résolu le problème pour moi.

4 votes

Dans Intellij Idea, la reconstruction résout parfois le problème.

2 votes

Cet article est très utile pour cette question reflectoring.io/nosuchmethod

250voto

Vetle Points 719

Sans plus d'informations, il est difficile d'identifier le problème, mais la cause principale est que vous avez probablement compilé une classe à partir d'une version différente de la classe à laquelle il manque une méthode, par rapport à celle que vous utilisez lorsque vous l'exécutez.

Regardez la trace de la pile ... Si l'exception apparaît lors de l'appel d'une méthode sur un objet d'une bibliothèque, il est très probable que vous utilisiez des versions différentes de la bibliothèque lors de la compilation et de l'exécution. Assurez-vous d'avoir la bonne version aux deux endroits.

Si l'exception apparaît lors de l'appel d'une méthode sur des objets instanciés par des classes vous est faite, il semble que votre processus de construction soit défectueux. Assurez-vous que les fichiers de classe que vous exécutez réellement sont mis à jour lors de la compilation.

4 votes

Nous avons récemment découvert la cause de l'un de ces problèmes et il s'est avéré que le processus de construction mettait en place des fichiers de classe avant que le serveur Java ne soit arrêté, et nous avons rencontré ce problème parce que le serveur Java n'avait pas chargé certaines classes, puis il en a chargé d'autres, mais il a reçu ces nouvelles classes, et comme le nouveau code faisait référence à des méthodes que les anciennes classes n'avaient pas... bingo, NoSuchMethodError.

1 votes

"Regardez la trace de la pile..." - Eh bien, je vais presque toujours vérifier la dernière trace de la pile. Caused by dans la trace de la pile pour trouver la classe/jar coupable.

0 votes

@Vetle, cela signifie-t-il que les classes importées sont chargées dynamiquement en Java, contrairement au chargement statique en C ?

112voto

Chris Dutrow Points 8662

J'ai eu le même problème et voici comment je l'ai résolu. Les étapes suivantes constituent une méthode de travail pour ajouter une bibliothèque. J'avais fait les deux premières étapes correctement, mais je n'avais pas fait la dernière en faisant glisser le fichier ".jar" directement du système de fichiers dans le dossier "lib" de mon projet Eclipse. De plus, j'ai dû supprimer la version précédente de la bibliothèque à la fois du chemin de construction et du dossier "lib".

Étape 1 - Ajouter .jar au chemin de construction

enter image description here

Étape 2 - Associer les sources et les javadocs (facultatif)

enter image description here

Étape 3 - Faire glisser le fichier .jar dans le dossier "lib" (non facultatif)

enter image description here

79 votes

+1 pour "Tout le monde s'attend à ce que vous sachiez comment l'utiliser et si vous ne le savez pas, ils notent votre question à la baisse".

79voto

erickson Points 127945

Notez que dans le cas de la réflexion, vous obtenez un NoSuchMethodException tandis qu'avec un code non réfléchissant, vous obtenez NoSuchMethodError . J'ai tendance à chercher dans des endroits très différents lorsque je suis confronté à l'un ou à l'autre.

2 votes

En d'autres termes, vous dites que si vous utilisez la réflexion pour obtenir une méthode sur une classe et que la méthode n'est pas trouvée, vous obtenez une NoSuchMethodException. Mais si vous êtes dans un scénario où vous avez compilé votre code avec certaines librairies et que sur le serveur vous avez d'autres librairies (peut-être plus récentes ou plus anciennes), alors vous obtenez l'erreur NoSuchMethodError. Corrigez-moi si je me trompe.

58voto

matt b Points 73770

Si vous avez la possibilité de modifier les paramètres de la JVM, l'ajout d'une sortie verbose devrait vous permettre de voir quelles classes sont chargées à partir de quels fichiers JAR.

java -verbose:class <other args>

Lorsque votre programme est exécuté, la JVM doit afficher des informations standard telles que

...

[Chargement de junit.framework.Assert depuis le fichier:/C:/Program%20Files/junit3.8.2/junit.jar]

...

4 votes

+1 Brillant ! J'ai résolu un petit problème désagréable en utilisant cette méthode, merci. C'est un excellent moyen de découvrir quand des classes se sont faufilées d'une manière ou d'une autre dans le classpath.

2 votes

+1 Vous avez sauvé ma journée ! Il s'agissait juste d'une bibliothèque qui incluait d'anciennes classes avec les mêmes noms dans ses sources.

1 votes

Je ne pense pas que d'autres réponses soient justifiées... c'est ainsi que l'on découvre d'où provient la mauvaise dépendance, ce qui est l'essence même de la question... cela a sauvé ma (deuxième) journée :)

15voto

John Meagher Points 6734

Cela se produit généralement lors de l'utilisation d'un système de construction tel que Apache Ant qui ne compile les fichiers java que lorsque le fichier java est plus récent que le fichier de classe. Si la signature d'une méthode change et que les classes utilisaient l'ancienne version, il se peut que les choses ne soient pas compilées correctement. La solution habituelle est de procéder à une reconstruction complète (habituellement "ant clean" puis "ant").

Ce problème peut également survenir lorsque l'on compile une version d'une bibliothèque et qu'on l'exécute avec une version différente.

2 votes

En fait, il s'agit plutôt d'un problème qui se pose aux programmeurs Java qui utilisent n'importe quel cadre de développement Java : Maven, NetBeans et Apache Ant, comme vous pouvez le voir dans toutes les réponses ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X