一. 前言
最近有很多初学Java的小伙伴,甚至是学习到了JavaWeb及框架阶段的小伙伴,跑来问千锋健哥:该如何解决Java中的ClassCastException类型转换异常?为了给大家解决这个较为普遍的问题,健哥今天就在这里,手把手地教大家分析解决掉这个异常,希望你以后再遇到类似的问题时可以轻松搞定它。
二. 异常现象
下面我们先来看看这个既简单,又经常会出的类型转换异常ClassCastException。首先我们得搞出这样的一个异常,下面这段代码运行后就会抛出ClassCastException类型转换异常。
1.Teacher接口代码
package com.qf.pojo;
/**
* @author 千锋健哥
*/
public interface Teacher {
/**
* 输入学科名字, 返回讲师可以讲哪些科目内容
* @param subject
* @return
*/
public String teach(String subject);
}
2.JavaTeacher实现类代码
package com.qf.pojo;
/**
* Java学科讲师实现类
* @author 千锋健哥
*/
public class JavaTeacher implements Teacher {
@Override
public String teach(String subject) {
return subject + "学科讲师, 可以讲业界最流行的分布式微服务架构, 以及企业解决方案";
}
}
3.H5Teacher实现类代码
package com.qf.pojo;
/**
* H5讲师实现类
* @author 千锋健哥
*/
public class H5Teacher implements Teacher{
@Override
public String teach(String subject) {
return subject + "学科讲师, 可以讲html, css, javascript";
}
}
4.测试代码
package test;
package com.qf.test;
import com.qf.pojo.H5Teacher;
import com.qf.pojo.JavaTeacher;
import com.qf.pojo.Teacher;
/**
* 测试类型转换异常
* @author 千锋健哥
*/
public class TestCastException {
public static void main(String[] args) {
Teacher teacher1 = new JavaTeacher();
Teacher teacher2 = new H5Teacher();
System.out.println("======" + teacher1.teach("JavaEE"));
System.out.println("======" + teacher2.teach("H5"));
//向下转型, 正常转型
JavaTeacher javaTeacher = (JavaTeacher)teacher1;
//向下转型, ClassCastException异常
H5Teacher h5Teacher = (H5Teacher)teacher1;
}
}
5.运行结果
上面的代码运行后,就产生了如上图所示的类型转换异常,那么该问题是怎么产生的,又该怎么解决呢?我们继续往下看!
三. 异常原因
接下来健哥先来给各位小伙伴解释一下这个异常产生的原因:
- 从上面我们设计的例子来看,java.lang.ClassCastException是进行强制类型转换时产生的异常。强制类型转换的前提是,父类引用指向的对象类型是子类时,才可以进行强制类型转换。所以如果父类引用指向的对象类型不是子类时,就会产生java.lang.ClassCastException异常。
- 例如 : JavaTeacher javaTeacher = (JavaTeacher)teacher1; 就可以正常转换,因为teacher1的类型就是JavaTeacher 类型。
- H5Teacher h5Teacher = (H5Teacher)teacher1; 就会发生异常,因为teacher1是JavaTeacher类型,而不是H5Teacher 类型,类型不匹配,所以就会产生java.lang.ClassCastException异常。
现在你明白为什么会出现ClassCastException异常了吗?那又该如何解决呢?
四. 解决办法
既然问题的原因我们找到了,那么接下来就可以很容易地解决了:
- 遇到这样异常的时候,如果你知道要访问对象的具体类型,直接转换成该类型即可;
- 例如 : H5Teacher h5Teacher = (H5Teacher)teacher1; 这句代码改为H5Teacher h5Teacher = (H5Teacher)teacher2 就可以了,因为 teacher2的类型就是H5Teacher 类型。
五. 结语
所谓的ClassCastException类型转换异常,其实本质上就是被转换的类型不匹配,我们只需要直接将引用对象的类型和被转换的对象类型改成一致的类型,就可以完美解决了。