大家好,又见面了,我是你们的朋友全栈君。
Java社区
添加小编微信进入java学习交流群,小编微信:372787553,备注进群
AbstractMethodError
Exception in thread “main” java.lang.AbstractMethodError 这样的异常并不常见,如果您有幸遇到了,那么一定要珍惜,否则转瞬即逝!
发生原因
为什么会发生这样的错误?
让我们看一下官方的解释:
当应用程序尝试调用抽象方法时抛出。 通常,该错误被编译器捕获; 如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。
AbstractMethodError 结构
演示错误以及解决方案
创建V1.0抽象接口并实现
代码语言:javascript复制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);
}
}
验证
验证代码
代码语言:javascript复制public class MainTest {
public static void main(String[] args) {
B dependency = new BImpl();
dependency.changedMethodInDifVersion(1);
}
}
结果
以上的代码都可以正常运行,接下来我们对接口进行升级改造
创建V2.0抽象接口并实现
代码语言:javascript复制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));
}
}
验证
代码
代码语言:javascript复制public class MainTest {
public static void main(String[] args) {
B dependency = new BImpl();
dependency.changedMethodInDifVersion(1,2);
}
}
结果
神奇的发生了错误
为何会发生错误的错误,是不是很尴尬,竟然中招了?
来让我们看看具体的报错:
代码语言:javascript复制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://javaforall.cn/138687.html原文链接:https://javaforall.cn