AbstractMethodError那些事

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

猜你喜欢

转载自blog.csdn.net/weixin_38937840/article/details/106907148