Я получаю следующее сообщение об ошибке периода выполнения (наряду с первой строкой отслеживания стека, которое указывает для выравнивания 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));
}
Из раздела 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).
Что означает «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
в то время как он объявлен недействительным
.