【问题标题】:Using the Stanford postagger in java, getting java.lang.IncompatibleClassChangeError在 java 中使用 Stanford postagger,得到 java.lang.IncompatibleClassChangeError
【发布时间】:2010-01-11 06:06:47
【问题描述】:

我正在尝试初始化斯坦福 NLP 语音标记器,但我不断收到 java.lang.IncompatibleClassChangeError。当我打印错误原因时,我得到空值,当我打印消息时,我得到实现类。

这是我的代码:

    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();
    }

}

有谁知道如何解决这个问题?

【问题讨论】:

  • @giggles,我在使用斯坦福 POS 标记器时遇到了同样的问题。你能帮我么?你是怎么解决这个问题的?

标签: java stanford-nlp pos-tagger


【解决方案1】:

IncompatibleClassChangeError 发生在某个类X 已针对某个其他类Y 的一个版本编译,然后尝试使用类Y 的不同(不兼容)版本加载它.如果您收到此错误而不是子类型,则可能意味着 Y 已从 interface 更改为 class 或反之亦然,或者其继承的接口和实现的类发生了更改。

您没有看到任何getMessage() 输出的原因是IncompatibleClassChangeErrorlava.lang.Error 的子类型而不是java.lang.Exception。因此,Exceptioncatch 没有捕捉到它。只需将 println(e.getMessage()) 行复制到下一个 catch 块即可解决此问题。

当您打印异常消息时,它应该会告诉您更多关于导致问题的原因。但根本原因是您需要重新编译和/或确保在编译时和运行时使用相同的库 JAR 文件。

【讨论】:

  • 难道我有两个版本的 jar 包含 MaxentTagger 类吗?我现在正在检查那个理论
  • 可能就是这样。但也尝试修复getMessage()
  • 抱歉,我粘贴时代码正在更改中。我以前打印所有的东西。
【解决方案2】:

这个问题读起来像dup of another stackoverflow question。这个问题的答案似乎很受欢迎,所以它可能会有所帮助。

顺便说一句:您应该验证用于编译您的应用程序的类是用于运行应用程序的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多