背景

AbstractMethodError异常对于我来说还是比较不常遇见的,最近有幸遇到,并侥幸的解决了,在这里把此种场景剖析一番,进入正题,下面是AbstractMethodError在Java的异常机制中所处的位置:

现在明确了AbstractMethodError所具有的特性:

1.它是Error的子类,Error类及其子类都是被划分在非检查异常之列的,就是说这些异常不能在编译阶段被检查出来,只能在运行时才会触发。

2.通过API文档里面的解释大致得出的结论就是说A依赖于B,但是执行的时候发现类B的定义发生了改变,这个改变是针对编译的时候发生了改变,也就是说将类A由java文件编译成.class文件的时候用到了类B的class文件,但是在执行的时候JVM发现真正用到的B的class文件和编译的时候用的不是一个了。于是这个异常就被抛了出来。

至此,AbstractMethodError发生的底层原因也了解的差不多了,再往深层的话就是java的编译机制,以及java代码的执行检查这些更靠近虚拟机的东东,那些我也没什么研究,暂且不表。

底层原因了解了,我们继续谈下平常遇到的更直观的场景:

ClassA ->AbstractClassB  ClassA 依赖于AbstractClassB,通常A是我们自己开发的类,而B则是引用的第三方jar包里面的抽象类。我们的项目中又存在AbstractClassB的多个实现版本,比如:1.0,1.2,2.0等版本,通常主版本号发生了改变的话,一般都是不兼容的。

类A

class A {B dependency = new BImpl();public void testMethod(){dependency.changedMethodInDifVersion(arg1, arg2);}
}

1.0版本的AbstractClassB:

abstract class B {// v1.0public abstract void changedMethodInDifVersion(int arg1);
}class BImpl extends B{public void changedMethodInDifVersion(int arg1){System.out.prinln("我是AbstractClassB 的 1.0 版本实现,Class A编译的时候我没参与,但是Class A运行的时候我却参与了。");        }
}

2.0版本的AbstractClassB:

abstract class B {//v2.0public abstract void changedMethodInDifVersion(int arg1, String arg2);
}class BImpl extends B{public void changedMethodInDifVersion(int arg1, String arg2){System.out.prinln("我是AbstractClassB 的 2.0 版本实现,编译的时候是我参与了编译");        }
}

如果在编译的时候使用的2.0版本中的BImpl和2.0版本的AbstractClassB,然而执行的时候使用的又是1.0版本的BImpl,那么就会抛出AbstractMethodError,这个异常抛出以后会把运行时真正找到的那个方法签名给打印出来的,异常信息会入下:

Exception in Thread XXXXX java.lang.AbstractMehodError  package.Class.运行时实际找到的方法

这个时候在你的classpath中寻找这个类,剔除掉不需要的版本就可以了。

如果在编译的时候使用的2.0版本中的BImpl和2.0版本的AbstractClassB,然而执行的时候使用的又是1.0版本的BImpl 和 1.0版本的AbstractClassB,就会报NoSuchMethodError。

Java AbstractMethodError 原因分析相关推荐

  1. java操作集合中 concurrentModifyException 异常的原因分析

    java操作集合中 concurrentModifyException 异常的原因分析 参考文章: (1)java操作集合中 concurrentModifyException 异常的原因分析 (2) ...

  2. StandardServer.await: create[8005]: java.net.BindException问题原因分析

    问题描述: 启动JBoss的时候一直失败, 查看后台日志发现存在BindException: Cannot assign requested address: JVM_Bind异常. 详细报错如下 2 ...

  3. Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法

    Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一.单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误 ...

  4. Java常见异常类型及原因分析

    Java常见异常类型及原因分析 0x1 NullPointerException异常 顾名思义,NullPointerException 是空指针异常.但是在 Java 中没有指针,怎么会有 空指针异 ...

  5. windows服务器java项目cpu占用较高原因分析

    前言 在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就简单多了最后的解决方法: 1.找到java进程对应的pid. 找pid的方法是:打开任务管理器,然后点击 ...

  6. 万字长文总结JAVA几种常见的编码格式和乱码原因分析

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 developer.ibm.com/zh/articles/j-lo-chine ...

  7. java.util.NoSuchElementException原因分析以及解决方法

    java输入流报错: Exception in thread "main" java.util.NoSuchElementExceptionat java.base/java.ut ...

  8. 用Java刷OJ超时怎么办?原因分析及解决方式

    Java超时原因? 又是Java超时. PAT不给Java延时,简直欺负Java选手.因为Java本身底层的一些原因,编译.运行起来会比其他语言慢一些.有很多其他OJ都放宽Java时间限制了. 以后除 ...

  9. java多线程举例买票之买电影票出现的了相同的票和负数票的原因分析和解决方法

    package cn.itcast_03; /** 我们在前面讲解的电影院售票程序,从表面上看,没什么问题* 但是在,真实的生活中,售票时网络时不能实时传输* 会有延迟的* * 通过加入延迟,就产生了 ...

最新文章

  1. mysql 线程池源码模块_易语言Mysql线程池2.0模块源码
  2. golang之‘...‘的用法
  3. IOS下将文字转成图片方法
  4. 鼠标右键 移动选定的文件夹到指定位置_怎么把电脑桌面上的文件移动到更加安全的地方...
  5. #define的高级用法
  6. 开源中文关系抽取框架,来自浙大知识引擎实验室
  7. asp.net listview 单元格文字颜色_Excel – 如何批量修改单元格中部分关键字的字体颜色?...
  8. 开源IT监控系统对比
  9. 利用Eigen求广义逆矩阵
  10. 负载均衡器/LB - 学习/实践
  11. mysqlin查询的java写法_[转载]常用的shell脚本
  12. Qt之QListWidget控件的应用
  13. 前置音频线接法图解(最全图解)
  14. 如何使用计算机网络打印机,电脑重新连接网络打印机的操作方法-电脑自学网...
  15. url跳转http不携带referer方法
  16. 【Linux】——库函数
  17. Vue3使用路由及配置vite.alias简化导入写法
  18. Linux输入输出系统原理笔记
  19. Cisco(思科)配置代码<根据学习进度持续跟新>
  20. 计算机系的对联,首个计算机对联系统问世

热门文章

  1. excel怎么启用宏_#数据同步#Excel + mysql 制作自动化报表
  2. 出场顺序很重要下一句_爆笑笑话:人生中遇见的每一个东西,出场顺序真的很重要……...
  3. Java - 描述一下JVM加载class文件的原理机制
  4. qq炫舞手游显示无法连接版本服务器,炫舞手游无法连接版本服务器怎么办_QQ炫舞手游3.21无法连接版本服务器解决方法_游戏吧...
  5. 服务器删除了数据库 怎么恢复数据库文件夹,SQL Server2008 数据库误删除数据的恢复方法分享...
  6. UGG公会和 Fantaverse游戏达成战略合作
  7. 无限乱斗机器人ap出装_LOLs10无限火力蒸汽机器人布里茨ap输出装符文玩法攻略...
  8. python—bs4模块解析
  9. 陌车万元购车app系统源码开发
  10. 像个黑客一样在网络上来无影去无踪之IP代理实践篇