发布时间:2025-12-09 12:05:37 浏览次数:1
添加小编微信进入java学习交流群,小编微信:372787553,备注进群
Exception in thread “main” java.lang.AbstractMethodError 这样的异常并不常见,如果您有幸遇到了,那么一定要珍惜,否则转瞬即逝!
为什么会发生这样的错误?
让我们看一下官方的解释:
当应用程序尝试调用抽象方法时抛出。 通常,该错误被编译器捕获; 如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。
abstract class B { // v1.0 public abstract void changedMethodInDifVersion(int arg1);}class BImpl extends B{ @Override public void changedMethodInDifVersion(int arg1) { System.out.println("结果为:"+arg1); }}验证代码
public class MainTest { public static void main(String[] args) { B dependency = new BImpl(); dependency.changedMethodInDifVersion(1); }}结果
abstract class B { // v1.0// public abstract void changedMethodInDifVersion(int arg1); // v2.0 public abstract void changedMethodInDifVersion(int arg1,int arg2);}class BImpl extends B{ @Override public void changedMethodInDifVersion(int arg1,int arg2) { System.out.println("结果为:"+(arg1+arg2)); }}代码
public class MainTest { public static void main(String[] args) { B dependency = new BImpl(); dependency.changedMethodInDifVersion(1,2); }}结果
神奇的发生了错误
为何会发生错误的错误,是不是很尴尬,竟然中招了?
来让我们看看具体的报错:
Exception in thread "main" java.lang.AbstractMethodError: Receiver class com.javayh.json.test.BImpl does not define or inherit an implementation of the resolved method 'abstract void changedMethodInDifVersion(int, int)' of abstract class com.javayh.json.test.B.at com.javayh.json.test.MainTest.main(MainTest.java:16)我们可以看到does not define or inherit an implementation of the resolved method 'abstract void changedMethodInDifVersion(int, int)' of abstract class 这样的提示,但是我们已经继承了该类的方法?那么错误肯定不在我们的代码,而在他编译解析的地方出了错误!接下来我们看看编译后的源码;
神奇的发现,BImpl 内的方法并没编译成功,这样我们重新进行编译,javac一下
这是我们我们发现错误已经解决,可以正常的运行!
为何会这样?其实在文章的起始位置已经说了发生原因,这是我们在来理解一下:
当应用程序尝试调用抽象方法时抛出。 通常,该错误被编译器捕获; 如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。
理解:
javac/mvn compile 138687.html