
Java社区

添加小编微信进入java学习交流群,小编微信:372787553,备注进群

AbstractMethodError

Exception in thread “main” java.lang.AbstractMethodError 这样的异常并不常见,如果您有幸遇到了,那么一定要珍惜,否则转瞬即逝!
发生原因
为什么会发生这样的错误?
让我们看一下官方的解释:
当应用程序尝试调用抽象方法时抛出。 通常,该错误被编译器捕获; 如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。
AbstractMethodError 结构
演示错误以及解决方案
创建V1.0抽象接口并实现
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);
}
}
结果
以上的代码都可以正常运行,接下来我们对接口进行升级改造
创建V2.0抽象接口并实现
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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/117940.html