2010-05-31 41 views
59

Aparece el siguiente mensaje de error de tiempo de ejecución (junto con la primera línea del seguimiento de la pila, que apunta a la línea 94). Estoy tratando de descubrir por qué dice que no existe tal método.Interpretación del mensaje java.lang.NoSuchMethodError

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) 

La línea 94 de writeSummaryLink se muestra a continuación.

PREGUNTAS
¿Qué quiere decir "ILcom" o "Z"?
Por qué hay cuatro tipos entre paréntesis (ILcom/sol/javadoc/ClassDoc; FCM/sol/javadoc/MemberDoc; Ljava/lang/cadena; Z) y uno después del paréntesis Ljava/lang/Cuerda; cuando el método printDocLinkForMenu claramente tiene cinco parámetros?

DETALLE DE CÓDIGO
El método writeSummaryLink es:

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); 
} 

Aquí está el método 94 está llamando:

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

Respuesta

16

¿Qué significa "ILcom" o "Z" significa ?

Esos son tipos de mapeo para tipos nativos. Puede encontrar una descripción general here.

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

Además, la firma "L fully-qualified-class ;" significaría la clase especificada de forma única con ese nombre; por ejemplo, la firma "Ljava/lang/String;" se refiere a la clase java.lang.String. Además, el prefijo [ a la firma hace que la matriz de ese tipo; por ejemplo, [I significa el tipo de matriz int.


cuanto a su siguiente pregunta:

Por qué hay cuatro tipos entre paréntesis (ILcom/sol/javadoc/ClassDoc; FCM/sol/javadoc/MemberDoc; Ljava/lang/String; Z) y uno después del paréntesis Ljava/lang/String; cuando el método printDocLinkForMenu claramente tiene cinco parámetros?

Porque no está ejecutando el código que cree que está ejecutando. El código de ejecución realmente está intentando llamar exactamente al método descrito en el mensaje de error, con cinco parámetros (el I se deben contar por separado) y un tipo de devolución String, pero este método no existe en el classpath en tiempo de ejecución (mientras estaba disponible en el classpath compiletime), de ahí este error. También ver el NoSuchMethodError javadoc:

produce si una aplicación intenta llamar a un método específico de una clase (ya sea estática o instancia), y que la clase ya no tiene una definición de ese método.

Normalmente, este error es capturado por el compilador; este error solo puede ocurrir en tiempo de ejecución si la definición de una clase ha cambiado de manera incompatible.

Por lo tanto, verificar si en realidad estás ejecutando la versión correcta del código que has publicado en tu pregunta y está utilizando las dependencias correctas en la ruta de clase en tiempo de ejecución y no tener duplicados diferentes bibliotecas versionados en la ruta de clase.

actualización: la excepción significa que el código real es (implícitamente) que intenta utilizar el método como el de la siguiente manera:

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

Debido a que se espera un resultado String mientras se declara void.

+0

+1 pero ¿qué es: 'ILcom/sun/javadoc/ClassDoc'? un intClassDoc? ¿O sería un error de copiar/pegar en ser: '[Lcom/sun/javadoc/ClassDoc'? o tal vez debería haber sido 'I; Lcom/sun/javadoc/ClassDoc' – OscarRyz

+0

¿Sabes cómo es un tipo genérico? – OscarRyz

+0

@Oscar: lo siento, no estoy seguro del tipo 'IL', esta es la primera vez que lo veo. Acerca de Generics, es solo azúcar sintáctico en tiempo de compilación y no aparece en bytecode. – BalusC

79

De section 4.3.2 de la JVM Spec:

 
Character  Type   Interpretation 
------------------------------------------ 
B    byte   signed byte 
C    char   Unicode character 
D    double  double-precision floating-point value 
F    float   single-precision floating-point value 
I    int   integer 
J    long   long integer 
L<classname>; reference  an instance of class 
S    short   signed short 
Z    boolean  true or false 
[    reference  one array dimension 

De section 4.3.3, Method descriptors:

Un descriptor método representa los parámetros que el método toma y el valor que devuelve:

MethodDescriptor: 
     (ParameterDescriptor*) ReturnDescriptor 

Por lo tanto,

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

se traduce en:

Un método con int, ClassDoc, MemberDoc, String y boolean como parámetros, y que devuelve un String. Tenga en cuenta que solo los parámetros de referencia se separan con un punto y coma, ya que el punto y coma es parte de la representación de sus caracteres.


Por lo tanto, para resumir:

Por qué hay cuatro tipos entre paréntesis (ILcom/sol/javadoc/ClassDoc; FCM/sol/javadoc/MemberDoc; Ljava/lang/Cadena ; Z) y uno después del paréntesis Ljava/lang/String; cuando el método printDocLinkForMenu claramente tiene cinco parámetros?

Hay cinco parámetros (int, ClassDoc, MemberDoc, String, boolean) y un tipo de retorno (String).

+0

La misma pregunta, ¿qué sería 'ILcom/sun/javadoc/ClassDoc'? – OscarRyz

+0

@Oscar Reyes: ver mi respuesta actualizada. I es int, L ... es el ClassDoc. – JRL

+1

Ya veo. es por eso que el booleano es '... ing; Z' porque es el último parámetro, pero el I que es el primero no necesita'; 'Veamos ... sí, este método:' public void x (int i , char c, booleano b, corto s, largo l, flotado f, doble d) 'se representa como:' x (ICZSJFD) V' +1 – OscarRyz

Cuestiones relacionadas