之前团队开发的android项目主要运行在android4.4的版本上,最近开发的一个新的项目的运行的os是android 5.1,当大家在开发完成之后,不管是在真机还是模拟器上运行,都会有如题描述的问题,经过认真比对之后,发现只要是运行在android5.0以上的环境下,就有异常,在5.0以下的设备中,安然无恙。下面详细记录处理过程:
1.通过设备的报错信息,可以看出这是一个运行时错误,在编译时是没有问题的,而且与设备的os版本有关系,想到android在5.0之后更换了java虚拟机,可能跟这个有关系,于是google了一番,得到的答案基本类似如下,在仔细检查了我们的代码之后,并没有这种问题,还得换种思路继续排查
2.在进一步的调试过程中,发现只要涉及到报错的这个类的任何操作都会抛出这个异常,包括调用构造方法和静态方法,说明是编译和运行时获得类的信息不一致,一下子想到了多态,在进一步分析代码的过程中发现了代码中有类似的实现,放出部分代码:
IPay.java
/** * * @author polymax * pay的接口 * */ public interface IPay { public float getPayed(); }
Pay.java
/** * * @author polymax * Pay的具体实现 * */ public class Pay implements IPay{ private float payedMoney; private float totalNeedPay; @Override public float getPayed(){ return payedMoney; } public float getTotalNeedMoney() { return totalNeedPay; } }
Order.java
/** * * @author polymax * 定义Order的接口 */ public interface Order { public IPay getPayInfo(); }
OderImpl.java
/** * * @author polymax * Order的具体实现 * */ public class OrderImpl implements Order { /** * 注意这里的返回值是Pay,不是Order接口中定义的IPay */ @Override public Pay getPayInfo() { return null; } }
在Order这个接口中定义的getPayInfo返回的是IPay这个接口,而在具体实现的时候,返回的是Pay,按照正常逻辑去理解,没有什么问题,事实上编译器也是这么理解的,但是问题就出在运行时,当我们修改了Order类getPayInfo的返回值为Pay之后,就解决了问题。
具体原因可能跟新的虚拟机有关系,这个解决问题的过程可能有些巧合,以后如果有空再去深究这个问题,先在这remark下,鄙人本身也不是做android的,如果有人路过看到,又恰好有知晓原因,欢迎留言告知,thx