Этот java.lang.AbstractMethodError обычно генерируется, когда мы пытаемся вызвать абстрактный метод. Обычно эта ошибка выявляется во время компиляции, если эта ошибка генерируется во время выполнения, класс должен быть несовместим (несовместим с существующими классами). ) Изменено. Но это подкласс ошибки IncompatibleClassChange.
Мы знаем, что абстрактный метод не может быть вызван, и если мы попытаемся это сделать, вы получите ошибку во время компиляции. Так что вы можете подумать, как эта ошибка генерируется во время выполнения ?.
Причина — двоичная несовместимость — что это значит?
Всякий раз, когда класс изменяется, другие классы, которые ссылаются на этот (измененный) класс, не будут знать об изменениях, сделанных в нем. Поэтому все классы должны быть скомпилированы как единое целое. Если нет, то вы можете столкнуться с одним из подклассов несовместимой ошибки изменения класса.
« Эта ошибка указывает на то, что вызываемый вами метод теперь преобразуется в абстрактный метод».
см. следующий пример, чтобы иметь представление об этой ошибке
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
class B { public void display() { System.out.println( "I am inside B" ); } } import java.util.*; public class A extends B { public static void main(String args[]) { A a= new A(); a.display(); } } |
Выход:
1
2
3
4
|
C:\blog>javac A.java C:\blog>java A I am inside B |
Теперь я собираюсь преобразовать метод display () как абстрактный метод и скомпилировать его самостоятельно.
1
2
3
4
|
abstract class B { public abstract void display(); } |
Выход:
01
02
03
04
05
06
07
08
09
10
11
|
C:\blog>javac A.java C:\blog>java A I am inside B C:\blog>javac B.java C:\blog>java A Exception in thread "main" java.lang.AbstractMethodError: B.display()V at A.display(A.java:3) at A.main(A.java:8) |
Как видите, причина того, что это исключение выдается во время выполнения, состоит в том, что я не скомпилировал классы в целом. Поэтому, когда вы вносите изменения в существующие классы, убедитесь, что вы скомпилировали классы в целом.
Следовательно, не рекомендуется преобразовывать метод в абстрактный метод в классах, которые распространяются. Чаще всего такого рода ошибки возникают, когда вы используете стороннюю библиотеку в своем приложении.
Если эта ошибка не отображается во время компиляции, даже если вы компилируете ее как целый пакет, вам необходимо проверить настройки библиотеки и пути к классам.
Поскольку компилятор обычно ищет классы в системных библиотеках, таких как библиотеки начальной загрузки и библиотеки расширений, также в текущем каталоге, но JVM ищет классы в указанном пути к классам.
Если вы случайно поместили старую версию в системные библиотеки, а новую версию — в путь к классам, вы не будете уведомлены об этой ошибке, даже если вы скомпилируете ее как целый пакет.
Поэтому убедитесь, что настройки, относящиеся к старому пакету, были удалены.
Ссылка: java.lang.AbstractMethodError от нашего партнера по JCG Ганеша Буддхана в блоге об ошибках и исключениях java .