【bug】ClassCastException 同一个类为什么还会类转换异常?

作者分享了在Java项目中遇到的ClassCastException,源于不同的类加载器。通过检查对象的类加载器和实例化新ClassLoader,解决了由于实体类加载器不一致导致的操作问题。讨论了类加载器对类转换的影响及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误日志:

2021-11-11 20:51:18.304 maomao 3896 [nio-8081-exec-2] ERROR c.maomao.common.GlobalExceptionHandler      79: java.lang.ClassCastException: com.maomao.learning.entity.LMCourseChapterDO cannot be cast to com.maomao.learning.entity.LMCourseChapterDO

实体集合是 hibernate 查到的结果,为啥不能操作了,for循环,stream处理都不行呢

源代码:

        List<LMCourseChapterDO> courseChapterList = lmDao.find(
                "from LMCourseChapterDO l where  l.course_id = ?0 and  is_delete=0", courseId);

        List<LMCourseChapterDTO> courseChapterDTOS = courseChapterList.stream().map(LMCourseChapterDO::toDTO).collect(Collectors.toList());

报错提示下面转换的一行发生了类转换异常。

编译正常,为啥运行时还能发生这个错误呢?

你猜是为啥?

明明类的全路径是一样的,整个项目也只有一个同名的类,所以和缓存,JDK,Idea 之类的环境没什么关系,不用瞎想。。。

要我说,我猜是类加载器的问题!因为一个类为什么是它本身,就是类的全路径和类加载决定的,所以我加了下面一段逻辑


        for (int i = 0; i < courseChapter.size(); i++) {
            Object lmCourseChapterDO = courseChapter.get(i);
            System.out.println("getClass:" + lmCourseChapterDO.getClass());
            System.out.println("new getClass:" + LMCourseChapterDO.class);
            System.out.println("getClassLoader:" + lmCourseChapterDO.getClass().getClassLoader());
            System.out.println("new getClassLoader:" + LMCourseChapterDO.class.getClassLoader());
        }

注意,这里的每一个对象一定要是Object,如果直接指定肯定是直接报类转换异常的嘛,不多讲。结果:

getClass:class com.maomao.learning.entity.LMCourseChapterDO
new getClass:class com.maomao.learning.entity.LMCourseChapterDO
getClassLoader:sun.misc.Launcher$AppClassLoader@18b4aac2
new getClassLoader:org.springframework.boot.devtools.restart.classloader.RestartClassLoader@7ec0d3cd

很明显嘛!

就是类加载器不一样嘛!

那怎么解决呢?

哈哈哈,我解决了,而且直接看打出来的类加载器来源就知道怎么解决了!

不过真有人有同样的问题么?

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值