68 votes

Interprétation du message java.lang.NoSuchMethodError

Je reçois le message d'erreur d'exécution (avec la première ligne de la trace de la pile, qui pointe à la ligne 94). Je suis à essayer de comprendre pourquoi il dit pas une telle méthode existe.

java.lang.NoSuchMethodError: 
com.sun.tools.doclets.formats.html.SubWriterHolderWriter.printDocLinkForMenu(
    ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;
    Ljava/lang/String;Z)Ljava/lang/String;
at com.sun.tools.doclets.formats.html.AbstractExecutableMemberWriter.writeSummaryLink(
    AbstractExecutableMemberWriter.java:94)

Ligne 94 de writeSummaryLink est indiqué ci-dessous.

QUESTIONS
Ce n' "ILcom" ou "Z"?
Pourquoi il y a quatre types entre parenthèses (ILcom/soleil/javadoc/ClassDoc;l'icom/soleil/javadoc/MemberDoc;Ljava/lang/String;Z) et l'un après l'parenthèses Ljava/lang/String; lorsque la méthode printDocLinkForMenu clairement a cinq paramètres?

CODE DE DÉTAILS
Le writeSummaryLink méthode est la suivante:

protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) {
    ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
    String 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 de la ligne de 94 à l'appel de la

public void printDocLinkForMenu(int context, ClassDoc classDoc, MemberDoc doc,
        String label, boolean strong) {
    String docLink = getDocLink(context, classDoc, doc, label, strong);
    print(deleteParameterAnchors(docLink));
}

89voto

JRL Points 36674

De l'article 4.3.2 de la JVM Spec:

Type De Caractère Interprétation
------------------------------------------
B octet octet signé
C char de caractères Unicode
D double de double précision en virgule flottante valeur
F flotteur simple précision à virgule flottante valeur
J'ai int entier
J long entier long
L<classname>; référence à une occurrence de la classe 
S court signé court
Z la valeur booléenne true ou false
[ référence à une dimension de la matrice

À partir de la section 4.3.3, la Méthode descripteurs:

Un descripteur de la méthode représente les paramètres que la méthode prend et la valeur qu'elle renvoie:

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

Ainsi,

(ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) Ljava/lang/String;

se traduit par:

Une méthode int, ClassDoc, MemberDoc, String et boolean comme paramètres, et qui retourne une String. Notez que seuls les paramètres de référence sont séparés par un point-virgule, depuis le point-virgule fait partie de leur caractère de représentation.


Donc, pour résumer:

Pourquoi il y a quatre types entre parenthèses (ILcom/soleil/javadoc/ClassDoc;l'icom/soleil/javadoc/MemberDoc;Ljava/lang/String;Z) et l'un après l'parenthèses Ljava/lang/String; lorsque la méthode printDocLinkForMenu clairement a cinq paramètres?

Il y a cinq paramètres (int, ClassDoc, MemberDoc, String, boolean) et un type de retour (Chaîne de caractères).

18voto

BalusC Points 498232

Ce n' "ILcom" ou "Z"?

Ce sont les types de projection pour les types natifs. Vous pouvez trouver un aperçu ici.

Type natif | Langage Java Type | Description | Type de signature
---------------+--------------------+------------------+----------------
unsigned char | jboolean | non signé 8 bits | Z
signed char | jbyte | signé 8 bits | B
unsigned short | jchar | non signé de 16 bits | C
court | jshort | signé de 16 bits | S
long | jint | signé de 32 bits | I
long long | jlong | signé de 64 bits | J
__int64 | | |
float | jfloat | 32 bits | F
double | jdouble | 64 bits | D

En outre, la signature "L fully-qualified-class ;" signifierait la classe unique spécifié par nom; par exemple, la signature "Ljava/lang/String;" fait référence à la classe java.lang.String. Aussi, la préfixation [ à la signature fait le tableau de ce type; par exemple, [I signifie que l'int type de tableau.


Quant à votre question suivante:

Pourquoi il y a quatre types entre parenthèses (ILcom/soleil/javadoc/ClassDoc;l'icom/soleil/javadoc/MemberDoc;Ljava/lang/String;Z) et l'un après l'parenthèses Ljava/lang/String; lorsque la méthode printDocLinkForMenu clairement a cinq paramètres?

Parce que vous n'êtes pas exécuter le code, vous pensez que vous êtes en cours d'exécution. Le fait d'exécuter du code est d'essayer d'appeler exactement ce que la méthode décrite dans le message d'erreur, en fait de cinq paramètres ( I devraient être comptabilisés séparément) et un Stringtype de retour, mais cette méthode n'existe pas dans le moteur d'exécution classpath (alors qu'il était disponible dans la compile-time classpath), d'où cette erreur. Voir aussi l' NoSuchMethodError javadoc:

Levée si une application tente d'appeler une méthode d'une classe (statique ou instance), et que la classe n'a plus de définition de cette méthode.

Normalement, cette erreur est capturé par le compilateur; cette erreur peut se produire uniquement au moment de l'exécution si la définition d'une classe a incompatibilité changé.

Donc, vérifiez si vous êtes effectivement en cours d'exécution dans la bonne version du code que vous avez posté votre question et utilisez le droit de dépendances à l'exécution de chemin de classe et de ne pas avoir de doublon différents versionnées bibliothèques dans le classpath.

Mise à jour: l'exception signifie que le réel code est (implicitement) d'essayer d'utiliser la méthode comme suit:

String s = printDocLinkForMenu(context, cd, (MemberDoc) emd, name, false);

Parce qu'il s'attend à un String résultat alors qu'il est déclaré void.

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