Интерпретация java.lang. Сообщение NoSuchMethodError

Я получаю следующее сообщение об ошибке периода выполнения (наряду с первой строкой отслеживания стека, которое указывает для выравнивания 94). Я пытаюсь выяснить, почему это говорит, что никакой такой метод не существует.

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)

Строку 94 из writeSummaryLink показывают ниже.

ВОПРОСЫ
Что означают "ILcom" или "Z"?
Почему существует четыре типа в круглых скобках (ILcom/sun/javadoc/ClassDoc; Lcom/sun/javadoc/MemberDoc; Ljava/lang/String; Z) и один после круглых скобок Ljava/lang/String; когда метод printDocLinkForMenu ясно имеет пять параметров?

ДЕТАЛЬ КОДА
writeSummaryLink метод:

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

Вот строка метода 94, звонит:

public void printDocLinkForMenu(int context, ClassDoc classDoc, MemberDoc doc,
        String label, boolean strong) {
    String docLink = getDocLink(context, classDoc, doc, label, strong);
    print(deleteParameterAnchors(docLink));
}
66
задан wattostudios 6 May 2012 в 03:45
поделиться

2 ответа

Из раздела 4.3.2 спецификации JVM:

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

Из раздела 4.3. 3, Дескрипторы методов:

Дескриптор метода представляет параметры, которые принимает метод, и значение, которое он возвращает:

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

Таким образом,

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

переводится как:

Метод с int, ClassDoc, MemberDoc, String и boolean в качестве параметров, и который возвращает String. Обратите внимание, что только параметры ссылок разделяются точкой с запятой, поскольку точка с запятой является частью их символьного представления.


Итак, подведем итоги:

Почему в скобках четыре типа (ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) и один после скобок Ljava/lang/String; когда метод printDocLinkForMenu явно имеет пять параметров?

Здесь пять параметров (int, ClassDoc, MemberDoc, String, boolean) и один возвращаемый тип (String).

86
ответ дан 24 November 2019 в 15:03
поделиться

Что означает «ILcom» или «Z»?

Это типы отображения для собственных типов. Вы можете найти обзор здесь .

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

Кроме того, подпись «L полностью-квалифицированный-класс;» будет означать класс, однозначно указанный этим именем; например, подпись «Ljava / lang / String;» относится к классу java.lang.String . Кроме того, добавление к подписи префикса [ делает массив этого типа; например, [I означает тип массива int.


Относительно вашего следующего вопроса:

Почему в скобках указано четыре типа (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / String; Z) и один после скобок Ljava / lang / String; когда метод printDocLinkForMenu явно имеет пять параметров?

Потому что вы не запускаете код, который, как вы думаете, вы выполняете.Выполняемый код на самом деле пытается вызвать именно тот метод, который описан в сообщении об ошибке, с фактически пятью параметрами ( I следует подсчитывать отдельно) и String возвращаемый тип, но этот метод не существует в пути к классам времени выполнения (хотя он был доступен в пути к классам времени компиляции), отсюда и эта ошибка. Также см. NoSuchMethodError javadoc :

Вызывается, если приложение пытается вызвать указанный метод класса (статический или экземплярный), и этот класс больше не имеет определения этого метода.

Обычно эту ошибку перехватывает компилятор; эта ошибка может возникнуть только во время выполнения, если определение класса было несовместимо изменено.

Итак, проверьте, действительно ли вы используете правильную версию кода, указанную в вашем вопросе, и используете ли правильные зависимости в пути к классам среды выполнения и не имеете ли дубликатов различных библиотек с поддержкой версий в пути к классам.

Обновление : исключение означает, что фактический код (неявно) пытается использовать метод, подобный следующему:

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

Поскольку ожидается результат String в то время как он объявлен недействительным .

18
ответ дан 24 November 2019 в 15:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: