当前位置: 首页 > 知识库问答 >
问题:

解释java.lang.NoSuchmetodError消息

上官季
2023-03-14

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


为什么括号里有四种类型(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));
}

共有2个答案

巫马玉堂
2023-03-14

“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;当PrintDocLinkFormMenu方法明显有五个参数时?

因为你没有运行你认为正在运行的代码。实际运行的代码正试图调用错误消息中描述的方法,实际上有五个参数(应分别计算I)和字符串返回类型,但此方法在运行时类路径中不存在(在compiletime类路径中可用),因此出现此错误。另请参见NoSuchMethodErrorjavadoc:

如果应用程序试图调用类(静态或实例)的指定方法,而该类不再具有该方法的定义,则引发。

通常,编译器会捕捉到这个错误;只有在类的定义发生了不兼容的更改时,才会在运行时发生此错误。

因此,请验证您是否真的在运行问题中发布的正确版本的代码,并且在运行时类路径中使用了正确的依赖项,并且在类路径中没有重复的不同版本库。

更新:异常表示实际代码(隐式地)尝试使用如下方法:

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

因为当它被声明为无效时,它期待一个String结果。

陆曜文
2023-03-14

JVM规范第4.3.2节:

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

翻译为:

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

所以,总结一下:

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

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

 类似资料:
  • 下面是我与bugzilla集成的代码,我遇到了一个异常 例外是: 我已成功登录,但当我运行conn.executeMethod(报告)时;我犯了错误。 线程“main”java中出现异常。lang.NoSuchMethodError:org。阿帕奇。xmlrpc。解析器。XmlrP应答器。getErrorCause()Ljava/lang/Throwable;在org。阿帕奇。xmlrpc。客户X

  • 问题内容: 以下段错误消息的正确解释是什么? 问题答案: 这是一个段错误,原因是跟随空指针试图查找要运行的代码(即在指令提取期间)。 如果这是一个程序,而不是共享库 运行(并重复给定的其他指令指针值)以查看错误发生的位置。更好的方法是,获得一个带有调试工具的内部版本,并在诸如gdb之类的调试器下重现该问题。 由于是共享库 不幸的是,您被水淹了。事后无法知道动态链接程序将库放置在内存中的位置。重现该

  • 我正在调试一个Azure Web应用程序上无法解释的内存消耗。我花了很多时间使用dotmemory、perfview和诊断工具挖掘日志、内存转储,但仍然无法理解为什么我们的应用程序内存一整天都在稳步增长。 我在堆中验证了多次,以确保请求前后的应用程序对象/模块都被释放,上面的屏幕截图显示了这一点。 如果你能分享一些关于如何找到消耗内存的东西的建议,我会的

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 本文向大家介绍解释Kafka可以接收的消息最大为多少?相关面试题,主要包含被问及解释Kafka可以接收的消息最大为多少?时的应答技巧和注意事项,需要的朋友参考一下 答:Kafka可以接收的最大消息大小约为1000000字节。

  • 请向我解释为什么我总是得到这个错误: 显然,我只在开发模式下得到它,它不会在我的生产构建中发生,但这非常烦人,我根本不明白在我的开发环境中出现错误不会在prod上显示的好处--可能是因为我缺乏理解。 或者强制使用如下构造函数检测更改:: 但是为什么我总是遇到这个错误呢?我想了解它,这样我就可以避免这些黑客修复在未来。