75

次のランタイム エラー メッセージが表示されます (行 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」とはどういう意味ですか?
括弧内に 4 つの型 (ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) があり、括弧の後に 1 つの型がある理由 Ljava/lang/String; メソッド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));
}
4

2 に答える 2

97

JVM仕様のセクション4.3.2から:

文字タイプの解釈
----------------------------------------------
B バイト符号付きバイト
C char Unicode 文字
D double 倍精度浮動小数点値
F float 単精度浮動小数点値
I int 整数
J long long integer
L<クラス名>; クラスのインスタンスを参照する
Sショートサインショート
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 つの型がある理由 Ljava/lang/String; メソッドprintDocLinkForMenuに明らかに5つのパラメーターがある場合は?

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

于 2010-05-31T20:57:07.980 に答える
18

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

これらは、ネイティブ型のマッピング型です。概要はこちらでご覧いただけます

ネイティブタイプ | Java 言語タイプ | 説明 | タイプ署名
---------------+--------------------+------------- ------+----------------
符号なし文字 | jboolean | 符号なし 8 ビット | Z
署名された文字 | jbyte | 符号付き 8 ビット | B
符号なし短 | jchar | 符号なし 16 ビット | ハ
短い | ショート | 符号付き 16 ビット | S
長い | ジント | 符号付き 32 ビット | 私
長い長い | 長い | 符号付き 64 ビット | J
__int64 | | | | |
フロート | jfloat| 32 ビット | ふ
ダブル | jdouble | 64 ビット | D

さらに、署名"L fully-qualified-class ;"は、その名前によって一意に指定されたクラスを意味します。たとえば、署名"Ljava/lang/String;"はクラスを参照しjava.lang.Stringます。また、[署名にプレフィックスを付けると、その型の配列が作成されます。たとえば、[Iint 配列型を意味します。


次の質問について:

括弧内に 4 つの型 (ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) があり、括弧の後に 1 つの型がある理由 Ljava/lang/String; メソッドprintDocLinkForMenuに明らかに5つのパラメーターがある場合は?

実行していると思われるコードを実行していないためです。実際に実行中のコードは、実際には 5 つのパラメーター (I個別にカウントする必要があります) と戻り値の型を使用して、エラー メッセージに記載されているメソッドを正確に呼び出そうとしていますString が、このメソッドはランタイム クラスパスに存在しません (コンパイル時のクラスパス)、したがってこのエラー。NoSuchMethodErrorjavadocも参照してください。

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

通常、このエラーはコンパイラによってキャッチされます。このエラーは、クラスの定義が非互換に変更された場合にのみ、実行時に発生する可能性があります。

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

更新: 例外は、実際のコードが次のように (暗黙的に) メソッドを使用しようとしていることを示します。

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

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

于 2010-05-31T20:49:51.257 に答える