解释java.lang.NoSuchMethod错误消息

解释java.lang.NoSuchMethod错误消息,java,nosuchmethoderror,Java,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/

我得到以下运行时错误消息(以及堆栈跟踪的第一行,它指向第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)
writeSummaryLink的第94行如下所示

问题
“ILcom”或“Z”是什么意思?
为什么括号中有四种类型 (ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) 括号后面还有一个 Ljava/lang/String; 当PrintDocLinkFormMenu方法明确有五个参数时

代码详细信息
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));
}
“ILcom”或“Z”是什么意思

这些是本机类型的映射类型。你可以找到一个概述

因为它在JVM规范中声明为void时需要一个
字符串
结果:

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 因此,

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

翻译为:

一种方法,使用
int
ClassDoc
MemberDoc
String
boolean
作为参数,并返回
字符串
。请注意,只有引用参数用分号分隔,因为分号是其字符表示的一部分


因此,总而言之:

为什么括号中有四种类型(ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z),括号后有一种是Ljava/lang/String;当PrintDocLinkFormMenu方法明确有五个参数时


有五个参数(int、ClassDoc、MemberDoc、String、boolean)和一个返回类型(String)。

+1但是什么是:
ILcom/sun/javadoc/ClassDoc
?医生?或者这是一个复制/粘贴错误,可能是:
[Lcom/sun/javadoc/ClassDoc
?或者它应该是
I;Lcom/sun/javadoc/ClassDoc
你知道泛型类型是什么样子吗?@Oscar:对不起,我不确定
IL
类型,这是我第一次看到它。关于泛型,它只是编译时的语法糖,不会出现在字节码中。不过它保留了签名,我看到类似这样的东西:Signature$Ljava/util/List;@JRL:ah,显然没有分隔符。似乎是分隔符的
实际上是
L
类型的一部分。同样的问题,什么是
ILcom/sun/javadoc/ClassDoc
ssDoc.我明白了。这就是为什么布尔值是
…ing;Z
,因为它是最后一个参数,但作为第一个参数的I不需要
让我们看看…是的,这个方法:
公共void x(int I,char c,boolean b,short s,long l,float f,double d)
表示为:
x(ICZSJFD)V
+1谢谢。我删除了我的类文件,重新编译,不再得到错误消息。显然,错误是一个没有更新的旧类。我非常感谢对类型引用的JVM规范的引用,解释了为什么错误消息在基本类型之后没有分号,以及如何识别retu我猜最后一个括号后面的V表示该方法没有返回值(void)。
String s = printDocLinkForMenu(context, cd, (MemberDoc) emd, name, false);
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
MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor