Utilizzando la postagger Stanford in java, ottenendo java.lang.IncompatibleClassChangeError
-
19-09-2019 - |
Domanda
Sto cercando di inizializzare la NLP Parte Stanford of Speech tagger e continuo a ricevere un java.lang.IncompatibleClassChangeError. Quando stampo la causa dell'errore, ottengo nulla, quando stampo il messaggio che ricevo classe di implementazione.
Questo è il mio codice:
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();
}
}
Qualcuno sa come risolvere questo problema?
Soluzione
Un IncompatibleClassChangeError
accade quando qualche classe X
è stato compilato con una versione di qualche altra Y
classe, e quindi viene eseguito un tentativo di caricare con una versione diversa (incompatibile) del Y
classe. Se hai trovato questo errore, piuttosto che un sottotipo, probabilmente significa che Y
è cambiato da un interface
ad un class
o viceversa, o che ci sia stato un cambiamento nelle sue interfacce ereditate e classi implementate.
La ragione per cui non si è visto alcun output getMessage()
è che IncompatibleClassChangeError
è un sottotipo di lava.lang.Error
non java.lang.Exception
. Quindi il catch
per Exception
non sta prendendo esso. Semplicemente copiando la linea println(e.getMessage())
al successivo blocco catch dovrebbe risolvere il problema.
Quando si stampa il messaggio di eccezione, dovrebbe dirvi di più su ciò che sta causando il problema. Ma la causa principale è che è necessario ricompilare e / o assicurarsi che si sta utilizzando gli stessi file JAR di libreria in fase di compilazione e di esecuzione.
Altri suggerimenti
Questa domanda si legge come un DUP di un'altra domanda StackOverflow . La risposta a questa domanda sembra essere stato piuttosto popolare, quindi è probabile che sia utile.
Per inciso:. È necessario verificare che le classi che vengono utilizzati per compilare la vostra applicazione sono le classi che vengono utilizzate per eseguire l'applicazione