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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Python画图源码|玫瑰花|皮卡丘|小猪佩奇|哆啦A梦|大白|小猫

    Python画图源码|玫瑰花|皮卡丘|小猪佩奇|哆啦A梦|大白|小猫Python各种画图源码Python各种画图源码Python真的太强大了,最近被Python的画图功能给震撼到了,原来Python还能这样画画,简直打开眼界。turtle没错,Python画图用的就是turtle这个库,这个库非常强大,简直就是神笔马良啊,可以画出各种你想要画的东西。所以下面一起来看一些效果图和视频吧效果图两个小孩皮卡丘小猪佩奇小熊猫小狗大熊小猫小鱼儿哆啦A梦小鸭子大白皮卡丘小

  • SpringBoot整合Mybatis超详细流程

    SpringBoot整合Mybatis超详细流程SpringBoot整合Mybatis超详细流程文章目录SpringBoot整合Mybatis超详细流程前言详细流程0.引入Mybatis1.创建数据2.创建程序目录3.理解后台访问流程4.核心文件配置5.编写entity6.编写dao7.编写Mapper8.编写Service9.编写Controller10.运行项目参考文章前言MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且

    2022年10月26日
  • wxPython 教程「建议收藏」

    wxPython 教程「建议收藏」wxPython简介wxPython环境wxPythonHelloWorldwxPythonGUI生成器工具wxPython主要类wxPython事件处理wxPython布局管理wxPython按钮wxPython可停靠窗口xPython多文档界面wxPythonDrawingAPIwxPython拖放…

  • 怎样解决栈溢出

    怎样解决栈溢出

    2021年11月14日
  • maven 打包命令的使用

    maven 打包命令的使用maven打包参数clean:clean能够保证上一次构建的输出不会影响到本次构建。package:命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库install:命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库deploy:命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其.

  • Java判断对象是否为空的方法:isEmpty,null,” “

    Java判断对象是否为空的方法:isEmpty,null,” “今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。查了一下关于判断为空的几个方法的区别,这里做一个简单的总结:null一个对象如果有可能是null的话,首先要做的就是判断是否为null:object==null,否则就有可能会出现空指针异常,这个通常是我们在进行数据库的查询操作时,查询结果首…

发表回复

您的电子邮箱地址不会被公开。

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