1

スタンフォードNLP品詞タガーを初期化しようとしていますが、java.lang.IncompatibleClassChangeErrorが発生し続けます。エラーの原因を出力するとnullになり、メッセージを出力するとImplementingClassが表示されます。

これは私のコードです:

    try {
        MaxentTagger tagger = new MaxentTagger(path+"left3words-wsj-0-18.tagger");
        Reader reader = new BufferedReader(new InputStreamReader(System.in));
        List<Sentence<? extends HasWord>> sentences = MaxentTagger.tokenizeText(reader);
        for (Sentence<? extends HasWord> sentence : sentences) {
            Sentence<TaggedWord> tSentence = MaxentTagger.tagSentence(sentence);
            System.out.println(tSentence.toString(false));
        }

    } catch (IOException e) {
        System.err.println("READ ERROR");
        e.printStackTrace();
    } catch (Exception e) {
        System.err.println("TAGGER ERROR");
        e.getMessage();
    } catch(java.lang.IncompatibleClassChangeError e){
        e.getStackTrace();
    }

}

誰かがこれを修正する方法を知っていますか?

4

2 に答える 2

1

この質問は、別のstackoverflow質問の重複のように読めます。その質問への答えはかなり人気があったようですので、それは役に立つでしょう。

余談ですが、アプリのコンパイルに使用されるクラスが、アプリの実行に使用されるクラスであることを確認する必要があります。

于 2010-01-11T06:42:38.583 に答える
1

あるIncompatibleClassChangeErrorクラスXが他のクラスのあるバージョンに対してコンパイルされた後、そのクラスYを別の(互換性のない)バージョンのクラスでロードしようとすると、が発生しますY。サブタイプではなくこのエラーが発生する場合は、Yがからまたはその逆に変更されたか、継承されたインターフェイスと実装されたクラスに変更があったことinterfaceを意味している可能性があります。class

getMessage()出力が表示されない理由は、 notIncompatibleClassChangeErrorのサブタイプであるためです。したがって、forはそれをキャッチしていません。行を次のcatchブロックにコピーするだけで、これを修正できます。lava.lang.Errorjava.lang.ExceptioncatchExceptionprintln(e.getMessage())

例外メッセージを出力すると、問題の原因について詳しく説明されているはずです。ただし、根本的な原因は、コンパイル時と実行時に同じライブラリJARファイルを再コンパイルおよび/または使用していることを確認する必要があることです。

于 2010-01-11T06:44:06.707 に答える