解释java.lang.NoSuchMethod错误消息
我得到以下运行时错误消息(以及堆栈跟踪的第一行,它指向第94行)。我试图弄明白为什么它说不存在这样的方法解释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/
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