AbstractMethodError那些事

2022-09-02 11:38:24 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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

0 人点赞