购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱10
隐患重重
——数据类型转换时可能存在的隐患

1.陷阱产生的场景

在应用程序开发中,经常会面临一些类型转换的情况,其中有些是确定可以转换的,比如,把一个类型的对象转换为基类类型;而有些类型转换是带有尝试性的,比如,把基类引用的对象转换成子类类型时,程序有可能会产生异常。

例4.10 数据类型转换时可能存在的隐患(光盘位置:光盘\MR\Instance\4\10\ Convert Type),该实例的主要分析过程如下。

下面定义3个类,其中Student类为基类,Pupil类和UniversityMan类均为Student类的子类。

根据上面定义的3个类,把其中的两个子类实例化,并将这两个子类的实例都转换为基类类型,代码如下:

上面的代码在编译和运行后没有任何异常,说明把一个类型的对象转换为它的基类类型是完全可靠的。

说明

在将一个类型的对象转换为它的基类类型时,可以不用像上面代码那样进行显式转换,使用隐式转换就可以,这里是为了突出说明类型转换。

相对于以上的类型转换方向,反之,把基类引用的对象转换成子类类型就存在着隐患,若相互转换的类型之间不匹配,则会产生类型转换异常,如下面的代码所示:

在上面的代码中,把Pupil类的对象传递给Student类的对象的引用,然后把Student类的对象转换成Pupil类型和UniversityMan类型,程序运行后出现如图4.17所示的异常提示。

图4.17 类型转换异常

2.陷阱的分析

从图4.17中可知,程序在编译时未发生错误,但在运行时产生了InvalidCastException异常,并且是在把Student类的对象转换为UniversityMan类型时发生的。仔细查看代码后找到了原因,stu引用(Student类的对象的引用)曾经指向过Pupil类的对象,但在转换类型之前,程序并没有显示判断过stu引用的对象的具体类型,就直接进行类型转换。当然转换成Pupil类型肯定是成功的,但转换成UniversityMan类型肯定要失败,其原因就是类型不匹配。

说明

通过上面的分析,可以做出这样的总结,在把基类引用的对象转换成子类类型之前,一定要进行类型的判断,然后再进行相应的类型转换,否则可能出现异常。

3.陷阱的解决方法

解决办法就是,在把stu引用的对象转换成Pupil类型或UniversityMan类型之前进行类型的判断,然后再进行类型转换,修改后的关键代码如下:

说明

在进行显式类型转换时,推荐使用as运算符。as运算符类似于强制转换操作,如果无法进行转换,则as返回null而非引发异常。 hsp+1FzSVXqvPPU6cKQ1a6zB+SbMbrxHl9MtFtjdAa5sSAlRDQabFW4lSg3Crwal

点击中间区域
呼出菜单
上一章
目录
下一章
×