AbstractMethodError那些事

AbstractMethodError那些事Java社区添加小编微信进入java学习交流群,小编微信:372787553,备注进群AbstractMethodErrorExceptioninthread“main”java.lang.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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138687.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac虚拟机连接网络问题

    mac虚拟机连接网络问题(转载:http://www.jb51.net/os/Windows8/84234.html)win8中mac虚拟机网络连接先设置自己的网络为共享然后设置VMnet8的TCP4/IPv4为自动获取ip然后将虚拟就的网络适配器的网络连接改成NAT然后根据自己的DNS设置mac上的DNS服务器然后就ok了转载于:https://www.cnblogs.com/tony0571/p/5581703…

    2022年6月17日
    99
  • iPad2成功越狱

    iPad2成功越狱昨天iPad2的越狱终于出啦,作为小白的我,在网上各种教程的帮助下,成功越狱!其实过程还是很简单的~ 步骤一:备份SHSH(据说如果你的设备无需降级,可以忽略备份SHSH这一步,不会对越狱有影响)参考:http://bbs.weiphone.com/read-htm-tid-20

    2022年5月30日
    45
  • sublime txt3 激活码【在线注册码/序列号/破解码】

    sublime txt3 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    36
  • CMake Error: The current CMakeCache.txt directory is different…[通俗易懂]

    CMake Error: The current CMakeCache.txt directory is different…[通俗易懂]零、问题描述开始学ROS时,需要编译别人的功能包,常常把别人的工作空间拿过来使用,但编译时会出现各种错误,如下的目录问题:CMakeError:ThecurrentCMakeCache.txtdirectory/home/vistar/desktop/catkin_ws/build/CMakeCache.txtisdifferentthanthedirectory/ho……………

    2025年7月25日
    1
  • 关于tempdb的一些注意事项

    关于tempdb的一些注意事项

    2021年11月25日
    44
  • Python中if __name__ == ‘__main__‘:的作用和原理「建议收藏」

    Python中if __name__ == ‘__main__‘:的作用和原理「建议收藏」if__name__==’__main__’:的作用一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if__name__==’main’:的作用就是控制这两种情况执行代码的过程,在if__name__==’main’:下的代码只有在第一种情况下(即文件作为脚本直接执行)才会…

    2022年6月1日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号