Je reçois le message d’erreur d’exécution suivant (avec la première ligne de la trace de la stack, qui pointe vers la ligne 94). J’essaie de comprendre pourquoi il est dit qu’aucune méthode de ce type n’existe.
java.lang.NoSuchMethodError: com.sun.tools.doclets.formats.html.SubWriterHolderWriter.printDocLinkForMenu( ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc; Ljava/lang/Ssortingng;Z)Ljava/lang/Ssortingng; at com.sun.tools.doclets.formats.html.AbstractExecutableMemberWriter.writeSummaryLink( AbstractExecutableMemberWriter.java:94)
La ligne 94 de writeSummaryLink est indiquée ci-dessous.
DES QUESTIONS
Que signifie “ILcom” ou “Z”?
Pourquoi il y a quatre types entre parenthèses (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / Ssortingng; Z) et un après les parenthèses Ljava / lang / Ssortingng; quand la méthode printDocLinkForMenu a clairement cinq parameters?
DÉTAIL DU CODE
La méthode writeSummaryLink est:
protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { ExecutableMemberDoc emd = (ExecutableMemberDoc)member; Ssortingng name = emd.name(); writer.strong(); writer.printDocLinkForMenu(context, cd, (MemberDoc) emd, name, false); // 94 writer.strongEnd(); writer.displayLength = name.length(); writeParameters(emd, false); }
Voici la méthode que la ligne 94 appelle:
public void printDocLinkForMenu(int context, ClassDoc classDoc, MemberDoc doc, Ssortingng label, boolean strong) { Ssortingng docLink = getDocLink(context, classDoc, doc, label, strong); print(deleteParameterAnchors(docLink)); }
À partir de la section 4.3.2 des spécifications de la JVM:
Interprétation du type de personnage ------------------------------------------ Octet signé par octet B Caractère Unicode C char D valeur double virgule flottante double précision Valeur à virgule flottante simple précision F float Je int entier J long long entier L; référencer une instance de classe S court signé court Z booléen vrai ou faux [référence à une dimension de tableau
À partir de la section 4.3.3, descripteurs de méthode :
Un descripteur de méthode représente les parameters pris par la méthode et la valeur renvoyée:
MethodDescriptor: ( ParameterDescriptor* ) ReturnDescriptor
Ainsi,
(ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/Ssortingng;Z) Ljava/lang/Ssortingng;
Se traduit par:
Une méthode avec int
, ClassDoc
, MemberDoc
, Ssortingng
et boolean
comme parameters et qui renvoie une Ssortingng
. Notez que seuls les parameters de référence sont séparés par un point-virgule, car le point-virgule fait partie de la représentation de leur caractère.
Pour résumer:
Pourquoi il y a quatre types entre parenthèses (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / Ssortingng; Z) et un après les parenthèses Ljava / lang / Ssortingng; quand la méthode printDocLinkForMenu a clairement cinq parameters?
Il existe cinq parameters (int, ClassDoc, MemberDoc, Ssortingng, booléen) et un type de retour (Ssortingng).
Que signifie “ILcom” ou “Z”?
Ce sont des types de mappage pour les types natifs. Vous pouvez trouver un aperçu ici .
Type natif | Type de langage Java | Description | Tapez la signature --------------- + -------------------- + ------------- ----- + ---------------- unsigned char | jboolean | non signé 8 bits | Z char signé | jbyte | signé 8 bits | B non signé court | jchar | 16 bits non signés | C court | jshort | signé 16 bits | S long | jint | signé 32 bits | je long long | jlong | signé 64 bits | J __int64 | | | flotteur | jfloat | 32 bits | F double | jdouble | 64 bits | ré
En outre, la signature
"L fully-qualified-class ;"
signifierait la classe spécifiée de manière unique par ce nom; par exemple, la signature"Ljava/lang/Ssortingng;"
fait référence à la classejava.lang.Ssortingng
. De plus, le préfixe[
à la signature rend le tableau de ce type; Par exemple,[I
signifie le type de tableau int.
En ce qui concerne votre prochaine question:
Pourquoi il y a quatre types entre parenthèses (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / Ssortingng; Z) et un après les parenthèses Ljava / lang / Ssortingng; quand la méthode printDocLinkForMenu a clairement cinq parameters?
Parce que vous n’exécutez pas le code que vous pensez exécuter. Le code en cours d’exécution tente d’appeler exactement la méthode décrite dans le message d’erreur, avec en fait cinq parameters (le I
doit être compté séparément) et un type de retour Ssortingng
, mais cette méthode n’existe pas dans le classpath runtime (alors qu’il était disponible dans le classpathime), d’où cette erreur. Voir aussi le javadoc NoSuchMethodError
:
Émis si une application tente d’appeler une méthode spécifiée d’une classe (statique ou instance) et que cette classe n’a plus de définition de cette méthode.
Normalement, cette erreur est interceptée par le compilateur; cette erreur ne peut se produire que lors de l’exécution si la définition d’une classe a été modifiée de manière incompatible.
Donc, vérifiez si vous exécutez la bonne version du code que vous avez publiée dans votre question et si vous utilisez les bonnes dépendances dans le chemin de classe d’exécution et si vous n’avez pas dupliqué différentes bibliothèques versionnées dans le chemin de classes.
Mise à jour : l’exception signifie que le code actuel tente (implicitement) d’utiliser la méthode comme suit:
Ssortingng s = printDocLinkForMenu(context, cd, (MemberDoc) emd, name, false);
Parce qu’il attend un résultat Ssortingng
alors qu’il est déclaré void
.