菜单
  

    错误原因:不是这个项目的问题,其实是其他同样在webapps下的项目出现来这个问题,所有要从其他的项目入手

     

    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等版本,通常主版本号发生了改变的话,一般都是不兼容的。

    class A {

    B dependency = new BImpl();

     

    public void testMethod(){

    dependency.changedMethodInDifVersion(arg1, arg2);

    }

    }

    1.0版本的AbstractClassB:

     

    abstract class B {

        // v1.0

        public 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.0

        public 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。

     

  1. 上一篇:<activity-alias>标签详解和使用
  2. 下一篇:我相信青春没有地平线是什么意思
  1. 企业员工离职原因调查问卷表

  2. 消费者抵触保险的原因调查问卷表

  3. 小学初任教师师生关系不和谐的原因访谈提纲

  4. 小学生语文学习兴趣缺失原因访谈提纲

  5. 大学生身体素质调查及肥胖原因问卷表

  6. 老年人保健品消费原因的访谈提纲

  7. 酒店员工流失原因调查问卷

  8. 小学课堂教学效率国内外研究现状和参考文献

  9. Bootstrap的OpenGL人体模型仿真

  10. 上市公司债务税盾文献综述和参考文献

  11. 淮安乐天玛特连锁超市4P营销策略分析

  12. 多智能体系统一致性问题研究

  13. 友谊质量调查问卷表

  14. MATLAB动车组列车牵引变流...

  15. PLC启闭机液压系统设计及其故障诊断

  16. PLC焊机电气控制系统设计开题报告

  17. 跨国企业全球营销策略的市场定位调查

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回