2013-07-31 48 views
13

Jakie są możliwe przyczyny ABstractMethodError?Dlaczego otrzymuję błędy java.lang.AbstractMethodError?

Wyjątek w wątku "pool-1-thread-1" java.lang.AbstractMethodError:

org.apache.thrift.ProcessFunction.isOneway()Z 
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:51) 
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39) 
    at com.gemfire.gemstone.thrift.hbase.ThreadPoolServer$ClientConnnection.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
+0

Podaj nam jakiś kontekst, co próbujesz zrobić? Może być jakiś problem z wersją! Metoda, którą wywołujesz lub jakikolwiek inny wywoływany kod jest teraz przekształcana w metodę abstrakcyjną. – NINCOMPOOP

+0

Próbowałem wersji hbase oszczędzania. Buduję kompilator oszczędnościowy i generuję pliki oszczędnościowe. i używając mvn do budowania mojego projektu, który pobiera również 0.9.0 wersję słoików z apache thrift. to jest to samo, którego używam. – Avinash

Odpowiedz

6

Prosta odpowiedź brzmi: niektóre kod próbuje wywołać metodę, która jest zadeklarowana abstract. Metody abstrakcyjne nie mają ciała i nie mogą być wykonane. Skoro masz tak mało informacji, pod warunkiem, że nie można naprawdę opracowania więcej o tym, jak to może się zdarzyć, ponieważ kompilator zazwyczaj łapie tego problemu - as described here, this means the class must have changed at runtime.

+0

Tak, metoda jest zdefiniowana jako abstrakcyjna, ale prześledziłem przez zaćmienie i widzę metody są realizowane w klasach podrzędnych – Avinash

+0

Oczywiście, ale oznacza to, że trzeba wywołać określoną implementację klasy potomnej. Nadal nie możesz wywołać samej metody. – jazzbassrob

+0

Sprawdziłem ponownie, generowany przez Apache kod generowany przez oszczędzanie nazywa się implementacja specyficzna dla obiektu dziecka – Avinash

1

Od documnentation z AbstractMethodError

Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.

27

To zazwyczaj oznacza, że ​​używasz stara wersja implementacji interfejsu, w której brakuje nowej metody interfejsu. Na przykład interfejs java.sql.Connection otrzymał nową metodę getSchema w wersji 1.7. Jeśli masz sterownik 1.6 JDBC i wywołuje Connection.getSchema, otrzymasz AbstractMethodError.

+2

Dobrze, masz mnie w "starej wersji interfejsu" – mtyson

0

Jeśli otrzymujesz ten błąd na zaimplementowanych metodach, upewnij się, że poprawnie dodałeś swoje zależności, jak wspomniano w artykule this thread.

Powiązane problemy