web-dev-qa-db-ja.com

Java.lang.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行目を以下に示します。

[〜#〜] questions [〜#〜]
「ILcom」または「Z」とはどういう意味ですか?
カッコ内に4つのタイプ(ILcom/Sun/javadoc/ClassDoc; Lcom/Sun/javadoc/MemberDoc; Ljava/lang/String; Z)とカッコLjava/lang/Stringの後に1つのタイプがある理由メソッドprintDocLinkForMenuに明らかに5つのパラメーターがある場合

コードの詳細
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));
}
66
dougkramer

セクション4.3.2 JVM仕様の:

文字タイプの解釈
 ------------------------------------- ----- 
 Bバイトの符号付きバイト
 C char Unicode文字
 D倍精度浮動小数点値
 F float単精度浮動小数点value 
 I int integer 
 J long long integer 
 L <classname>;クラスのインスタンスを参照
 S short signed short 
 Z boolean trueまたはfalse 
 [1つの配列次元を参照

セクション4.3.3、メソッド記述子 から:

メソッド記述子は、メソッドが受け取るパラメーターと、メソッドが返す値を表します。

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

したがって、

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

に翻訳する:

intClassDocMemberDocString、およびbooleanをパラメーターとして持ち、Stringを返すメソッド。セミコロンは文字表現の一部であるため、参照パラメーターのみがセミコロンで区切られていることに注意してください。


だから、まとめると:

括弧内に4つのタイプ(ILcom/Sun/javadoc/ClassDoc; Lcom/Sun/javadoc/MemberDoc; Ljava/lang/String; Z)があり、括弧の後に1つのタイプがあるのはなぜですか。メソッドprintDocLinkForMenuに明らかに5つのパラメーターがある場合

5つのパラメーター(int、ClassDoc、MemberDoc、String、boolean)と1つの戻り型(String)があります。

85
JRL

「ILcom」または「Z」とはどういう意味ですか?

これらはネイティブ型のマッピング型です。概要を見つけることができます こちら

ネイティブタイプ| Java言語タイプ|説明|タイプ署名
 --------------- + ------------ -------- + ------------------ + ---------------- 
 unsigned char | jboolean | unsigned 8ビット| Z 
 signed char | jbyte | signed 8ビット| B 
 unsigned short | jchar | unsigned 16ビット| C 
 short | jshort | signed 16ビット| S 
 long | jint |符号付き32ビット| I 
 long long | jlong​​ |符号付き64ビット| J 
 __ int64 | | | 
 float | jfloat | 32ビット| F 
 double | jdouble | 64ビット| D 

さらに、署名"L fully-qualified-class ;"は、その名前で一意に指定されたクラスを意味します。例:署名"Ljava/lang/String;"はクラスを指しますJava.lang.String。また、接頭辞[署名に対して、そのタイプの配列を作成します。例えば、 [Iはint配列型を意味します。


次の質問について:

カッコ内に4つのタイプ(ILcom/Sun/javadoc/ClassDoc; Lcom/Sun/javadoc/MemberDoc; Ljava/lang/String; Z)とカッコLjava/lang/Stringの後に1つのタイプがある理由メソッドprintDocLinkForMenuが明らかに5つのパラメーターを持っているときは?

コードを実行していないため、実行していると思われます。 実際に実行中のコードは、実際には5つのパラメーター(Iを個別にカウントする必要があります)とStringreturn型ですが、このメソッドは(コンパイル時クラスパスで使用可能だった)実行時クラスパスに存在しないため、このエラーが発生します。 NoSuchMethodError javadoc も参照してください。

アプリケーションがクラスの指定されたメソッド(静的またはインスタンス)を呼び出そうとして、そのクラスにそのメソッドの定義がなくなった場合にスローされます。

通常、このエラーはコンパイラーによってキャッチされます。このエラーは、クラスの定義に互換性がない場合にのみ実行時に発生します。

したがって、質問に投稿したように実際に正しいバージョンのコードを実行しており、ランタイムクラスパスで正しい依存関係を使用しており、クラスパスで異なるバージョンのライブラリが重複していないことを確認してください。

Update:例外は、actualコードが(暗黙的に)次のようなメソッドを使用しようとしていることを示します次のとおりです。

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

Stringと宣言されている間、voidの結果を期待しているためです。

17
BalusC