Java中java.lang.ClassCastException異常原因及解決方法
通常我們?cè)?OOP 設(shè)計(jì)中都會(huì)使用到繼承。
??但是在繼承對(duì)象之間的強(qiáng)制轉(zhuǎn)換可能會(huì)遇到??java.lang.ClassCastException?
?異常的錯(cuò)誤。
錯(cuò)誤的日志如下:
19:58:25.010 [http-nio-8080-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: class com.ossez.usreio.mls.common.models.response.ListingResponse cannot be cast to class com.ossez.usreio.mls.common.models.response.ListingDetailResponse (com.ossez.usreio.mls.common.models.response.ListingResponse and com.ossez.usreio.mls.common.models.response.ListingDetailResponse are in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @4ee285c6)] with root cause java.lang.ClassCastException: class com.ossez.usreio.mls.common.models.response.ListingResponse cannot be cast to class com.ossez.usreio.mls.common.models.response.ListingDetailResponse (com.ossez.usreio.mls.common.models.response.ListingResponse and com.ossez.usreio.mls.common.models.response.ListingDetailResponse are in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @4ee285c6)
??問題和原因
這個(gè)問題出現(xiàn)的原因就是繼承類之間強(qiáng)制轉(zhuǎn)換的錯(cuò)誤。
同時(shí)這個(gè)錯(cuò)誤是運(yùn)行時(shí)錯(cuò)誤,不是編譯錯(cuò)誤,因此你編譯的時(shí)候是沒有這個(gè)錯(cuò)誤的。
考察下面的代碼:
Parent b = new parent(); Child c = (Child) b ;
采用該方法不能實(shí)現(xiàn)對(duì)象類型由超類向子類的轉(zhuǎn)換。
上面的原因是父類的對(duì)象是由父類創(chuàng)建的,然后你嘗試將父類創(chuàng)建的對(duì)象強(qiáng)制轉(zhuǎn)換到子類中。
因?yàn)楦割悇?chuàng)建的對(duì)象和子類需要?jiǎng)?chuàng)建的對(duì)象分別使用不同的地址空間,那在轉(zhuǎn)換的時(shí)候?qū)?huì)出現(xiàn)地址空間引用的錯(cuò)誤,因此 JVM 會(huì)認(rèn)為你將 2 個(gè)完全不同類型的對(duì)象進(jìn)行轉(zhuǎn)換,這個(gè)時(shí)候出現(xiàn)上面的運(yùn)行時(shí)錯(cuò)誤。
要解決這個(gè)問題的辦法就是在創(chuàng)建父類的時(shí)候使用子類來創(chuàng)建,并且強(qiáng)制將創(chuàng)建的父類轉(zhuǎn)換為子類就可以了。
使用這種創(chuàng)建方法就能保證使用相同的地址空間。
將上面的語句改成:
Parent b = new Child (); Child c = (Child) b ;
就可以了。
總結(jié)
到此這篇關(guān)于Java中java.lang.ClassCastException異常原因及解決方法的文章就介紹到這了,更多相關(guān)java.lang.ClassCastException異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot安全認(rèn)證Security的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot安全認(rèn)證Security的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02使用java的Calendar對(duì)象獲得當(dāng)前日期
本文給大家分享的是使用使用java的Calendar對(duì)象獲得當(dāng)前日期的上幾個(gè)度開始、結(jié)束時(shí)間,主要思路是先獲得當(dāng)前季度的開始和結(jié)束日期,在當(dāng)前日期的基礎(chǔ)上往前推3個(gè)月即上個(gè)季度的開始和結(jié)束日期,十分的實(shí)用,小伙伴們可以參考下。2015-07-07Spring?Security中如何獲取AuthenticationManager對(duì)象
有時(shí)需要使用AuthenticationManager(以下簡(jiǎn)稱Manager)對(duì)象,可是這個(gè)對(duì)象不是Bean,沒有直接保存在Spring的Bean庫中,那么如何獲取Spring Security中的這個(gè)對(duì)象呢,需要的朋友可以參考下2022-11-11Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Spring使用IOC與DI實(shí)現(xiàn)完全注解開發(fā)
IOC也是Spring的核心之一了,之前學(xué)的時(shí)候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個(gè)注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC + DI2022-09-09Elasticsearch配置文件選項(xiàng)作用詳解(es7)
這篇文章主要為大家介紹了Elasticsearch配置文件選項(xiàng)作用詳解(es7),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java實(shí)現(xiàn)簡(jiǎn)單的聊天室功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06