java - 解释 java.lang.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/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/语言/字符串; 当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));
}

最佳答案

来自 section 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

From section 4.3.3, Method descriptors:

A method descriptor represents the parameters that the method takes and the value that it returns:

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

因此,

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

翻译为:

具有 intClassDocMemberDocStringboolean 的方法作为参数,它返回一个 String。请注意,只有引用参数用分号分隔,因为分号是其字符表示的一部分。


所以,总结一下:

Why there are four types in parentheses (ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) and one after the parentheses Ljava/lang/String; when the method printDocLinkForMenu clearly has five parameters?

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

关于java - 解释 java.lang.NoSuchMethodError 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945862/

相关文章:

java - 剪辑区域以在动画期间隐藏 JWindow

java - ServerBuilder.forPort(端口) - java.lang.NoSuchMethodError

java - 在 Retrofit 2 中添加第三个 @Field 时出现 NoSuchMethodError

java - 将整数值转换为匹配的 Java 枚举

java - 如何使用 args4j 访问子命令中的主上下文来实现子命令处理程序?

java - 如何检索本地化的 Linkedin 登录页面

java - Maven 如何知道在哪里可以找到 Java 1.5

scala - (run-main-0) java.lang.NoSuchMethodError

java - iaik pkcs#11 包装器和 java.lang.NoSuchMethodError

java - qrgen 和 zxing 库出现 java.lang.NoSuchMethodError 异常