Используя постаггер Stanford в java, получая java.lang.IncompatibleClassChangeError

Я пытаюсь инициализировать Stanford NLP Part of Speech tagger и продолжаю получать 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();
    }

}

Кто-нибудь знает, как это исправить?

2 ответа

Решение

IncompatibleClassChangeError происходит, когда какой-то класс X был скомпилирован с одной версией некоторого другого класса Y, а затем делается попытка загрузить его с другой (несовместимой) версией класса Y, Если вы получаете эту ошибку, а не подтип, это, вероятно, означает, что Y изменился с interface к class или наоборот, или что произошли изменения в его унаследованных интерфейсах и реализованных классах.

Причина, по которой вы не видите getMessage() выход в том, что IncompatibleClassChangeError это подтип lava.lang.Error не java.lang.Exception, Следовательно catch за Exception не ловит это. Просто копирую println(e.getMessage()) строка к следующему блоку catch должна исправить это.

Когда вы печатаете сообщение об исключении, оно должно рассказать вам больше о том, что является причиной проблемы. Но основная причина в том, что вам нужно перекомпилировать и / или убедиться, что вы используете одни и те же библиотечные JAR-файлы во время компиляции и во время выполнения.

Этот вопрос читается как дубликат другого вопроса stackru. Ответ на этот вопрос, кажется, был довольно популярен, поэтому он, вероятно, будет полезен.

Кроме того: вы должны убедиться, что классы, которые используются для компиляции вашего приложения, являются классами, которые используются для запуска приложения.

Другие вопросы по тегам