解释java.lang.NoSuchMethodError消息

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我收到以下运行时错误消息(以及第一行堆栈跟踪,它指向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后面的一个; 当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));
}
提问于
用户回答回答于

“ILcom”或“Z”是什么意思?

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

原生类型| Java语言类型| 说明| 类型签名
---------------+--------------------+------------------+----------------
unsigned char | jboolean | 无符号8位| ž
signed char | jbyte | 签名8位| 乙
unsigned short | jchar | 无符号16位| C
短| | jshort | 签名16位| 小号
长| jint | 签名32位| 一世
很长很长 jlong​​ | 签名64位| Ĵ
__int64 | | |
float | jfloat | 32位| F
双| jdouble | 64位| d

另外,签名"L fully-qualified-class ;"意味着由该名称唯一指定的类; 例如,签名"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返回类型,但这种方法不会在运行时类路径存在(而这是在现有编译时类路径),所以这个错误。另请参阅NoSuchMethodErrorjavadoc

如果应用程序试图调用某个类的指定方法(静态或实例),并且该类不再具有该方法的定义,则抛出该方法。 通常,这个错误被编译器捕获; 如果某个类的定义发生了不兼容的更改,则只能在运行时发生此错误。

因此,请确认您是否实际运行了正确的代码版本,并且在运行时类路径中使用了正确的依赖关系,并且没有在类路径中重复使用不同的版本化库。

异常表示实际代码是(隐式)尝试使用如下所示的方法:

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

因为它String在申报时期待结果void

用户回答回答于

从JVM规范的第4.3.2节

字符类型解释
------------------------------------------
B字节有符号字节
C char Unicode字符
D双精度浮点值
F浮点单精度浮点值
我int整数
J长整型
→<类名>; 引用一个类的实例
S短签名空头
Z布尔值true或false
[引用一个数组维度

第4.3.3节,方法描述符

方法描述符表示该方法需要的参数及其返回的值:

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

从而,

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

转化为:

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

所以,总结一下:

为什么括号中有四种类型(ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / String; Z)和括号Ljava / lang / String后面的一个; 当printDocLinkForMenu方法显然有五个参数?

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

扫码关注云+社区