日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

代碼出錯了,IDE竟然不報錯?太詭異了....

來源: 責編: 時間:2024-01-04 09:33:20 298觀看
導讀小伙伴好哇,我是Tom哥。今天分享一個寫代碼時遇到的詭異問題,如何排查解決的。從事互聯網的人都懂,一般遇到問題時,首先會想用谷歌、百度等搜索引擎,看看前輩們是如何解決的。但有些問題比較抽象,不知道如何來描述,怎么辦?或

gBw28資訊網——每日最新資訊28at.com

小伙伴好哇,我是Tom哥。gBw28資訊網——每日最新資訊28at.com

今天分享一個寫代碼時遇到的詭異問題,如何排查解決的。gBw28資訊網——每日最新資訊28at.com

從事互聯網的人都懂,一般遇到問題時,首先會想用谷歌、百度等搜索引擎,看看前輩們是如何解決的。gBw28資訊網——每日最新資訊28at.com

但有些問題比較抽象,不知道如何來描述,怎么辦?或者勉強描述清楚了,搜出來的答案也很難滿足要求,整個過程猶如大海撈針。最后求助 ChatGPT 瞬間解決,給大家分享下解決思路。gBw28資訊網——每日最新資訊28at.com

問題的來龍去脈

正在開發一個項目,倉儲層有一個接口類(IProductReadRepository),其中一個方法的入參使用了 Java 泛型,具體如下:gBw28資訊網——每日最新資訊28at.com

List<SpuVO> batchQuerySpuBySpuIdsFromDB(ProductQueryWrapper<List<Long>> req);

在上層的領域服務中,有一處調用這個方法的代碼,具體如下:gBw28資訊網——每日最新資訊28at.com

ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()        .bizCode(BusinessCodeEnum.SMART.getCode())        .bizScene(BusinessSceneEnum.RETAIL.getCode())        .storeId(multiPackageVO.getStoreId())        .bizParams(spuIds)        .build();List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper);if (CollectionUtils.isEmpty(productSummaryVOS)) {    bizResult.error(BizErrorCode.MULTI_PACKAGE_PRODUCT_NOT_EXIST);    return bizResult;}

其中,List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper); 這行代碼非常詭異gBw28資訊網——每日最新資訊28at.com

返回的結果List<ProductSummaryVO>并不匹配,但在IDEA中卻沒有報錯,這讓我們感到非常困擾。gBw28資訊網——每日最新資訊28at.com

這是怎么回事?gBw28資訊網——每日最新資訊28at.com

當時懷疑是錯覺,仔細對比了兩個方法,確實是對的。gBw28資訊網——每日最新資訊28at.com

又懷疑是 IDEA 的緩存干擾導致,所以將工程重新 build 了一次還是不行!gBw28資訊網——每日最新資訊28at.com

接下來,能想到的各種招數都招呼上,比如:gBw28資訊網——每日最新資訊28at.com

  • 在終端執行 mvn clean install -U,重新編譯代碼,并強制 Maven 更新所有依賴的快照版本(Snapshot)
  • 手動將 maven 的本地倉庫的依賴包全部刪除,重新拉取
  • 將本地工程文件中的 target 文件刪除
  • .....

最后,使出絕招,將本地的工程代碼全部刪除,然后重新從 git 上拉取最新代碼,編譯,導入到 IDEA 工程。gBw28資訊網——每日最新資訊28at.com

但,但,但,問題依然存在,真讓人崩潰。gBw28資訊網——每日最新資訊28at.com

難道是 IDEA 中的錯誤檢查失效了,于是人為制造了一些錯誤,發現 IDEA 也都能識別出來。gBw28資訊網——每日最新資訊28at.com

實在沒招了。。。。。。。gBw28資訊網——每日最新資訊28at.com

最后,還是問下 ChatGPT 吧gBw28資訊網——每日最新資訊28at.com

首先,先把問題描述清楚,ChatGPT 特懂人情世故,你跟他講清楚問題,他也會給你一個清楚的答案。gBw28資訊網——每日最新資訊28at.com

有一個接口內的方法定義如下: List<SpuVO> batchQuerySpuBySpuIdsFromDB(ProductQueryWrapper<List<Long>> req);使用下面的代碼來調用 batchQuerySpuBySpuIdsFromDB,返回的 List<SpuVO> 結果并不匹配,但在 IDEA 中沒有報錯,是什么原因?ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()        .bizCode(BusinessCodeEnum.SMART.getCode())        .bizScene(BusinessSceneEnum.RETAIL.getCode())        .storeId(multiPackageVO.getStoreId())        .bizParams(spuIds)        .build();List<ProductSummaryVO> productSummaryVOS = productReadRepository.batchQuerySpuBySpuIdsFromDB(productQueryWrapper);if (CollectionUtils.isEmpty(productSummaryVOS)) {    bizResult.error(BizErrorCode.MULTI_PACKAGE_PRODUCT_NOT_EXIST);    return bizResult;}

gBw28資訊網——每日最新資訊28at.com

ChatGPT 很快就給出了答案。gBw28資訊網——每日最新資訊28at.com

問題可能出在泛型擦除和編譯時類型檢查上。由于Java泛型的擦除機制,在運行時無法獲取泛型的實際類型,這可能導致類型不匹配的問題。gBw28資訊網——每日最新資訊28at.com

gBw28資訊網——每日最新資訊28at.com

那我們就按照它的思路來,將這行代碼  ProductQueryWrapper productQueryWrapper = ProductQueryWrapper.builder()gBw28資訊網——每日最新資訊28at.com

修改為  ProductQueryWrapper<List<Long>> productQueryWrapper = ProductQueryWrapper.<List<Long>>builder()gBw28資訊網——每日最新資訊28at.com

在構建 ProductQueryWrapper 對象時, 指定泛型參數的具體類型,以便在運行時能夠正確地識別參數類型。gBw28資訊網——每日最新資訊28at.com

然后,問題真的解決了。gBw28資訊網——每日最新資訊28at.com

如下圖所示,第二處紅框位置的代碼開始報錯。因為接口的規范(返回結果)調整了,此處確實應該報錯提示。gBw28資訊網——每日最新資訊28at.com

gBw28資訊網——每日最新資訊28at.com

后面,我們根據錯誤提示,將 ProductSummaryVO 類替換成 SpuVO 類。gBw28資訊網——每日最新資訊28at.com

最終,不但編譯不報錯,單元測試也能跑通。問題完美解決。gBw28資訊網——每日最新資訊28at.com

gBw28資訊網——每日最新資訊28at.com

背后的原因

為何在 IDEA 中沒有直接報錯呢?這里牽扯到Java泛型的類型推斷機制。gBw28資訊網——每日最新資訊28at.com

上述代碼中,雖然使用了原始類型 ProductQueryWrapper ,但沒有指定具體的泛型類型。gBw28資訊網——每日最新資訊28at.com

Java 7 及以后的版本引入了菱形操作符(Diamond Operator),允許在創建對象時不再重復指定泛型類型,而是通過上下文進行類型推斷。gBw28資訊網——每日最新資訊28at.com

這就意味著在你的代碼中,雖然沒有明確指定泛型類型,但由于在 ProductQueryWrapper.builder() 上下文中,編譯器會嘗試根據調用方的期望類型來推斷泛型參數。gBw28資訊網——每日最新資訊28at.com

這種類型推斷機制使得在 IDEA 開發工具不會直接報錯,也就出現了上文說到的那個問題。gBw28資訊網——每日最新資訊28at.com

今天的分享就到這里,我們下回再見。gBw28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-57393-0.html代碼出錯了,IDE竟然不報錯?太詭異了....

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring國際化的應用及原理詳解

下一篇: Elasticsearch 8.X 小技巧:使用存儲腳本優化數據索引與轉換過程

標簽:
  • 熱門焦點
  • 深度探索 Elasticsearch 8.X:function_score 參數解讀與實戰案例分析

    在 Elasticsearch 中,function_score 可以讓我們在查詢的同時對搜索結果進行自定義評分。function_score 提供了一系列的參數和函數讓我們可以根據需求靈活地進行設置。近期
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創意日前,Meta創始人兼CEO 馬克&middot;扎克伯發布公開信,宣布Meta計劃裁員超11000人,占其員工總數13%。他公開承認了自己的預判失誤:&ldquo;不僅
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top 主站蜘蛛池模板: 三亚市| 双柏县| 同德县| 江孜县| 禹城市| 榕江县| 类乌齐县| 沙雅县| 泗水县| 榆树市| 武清区| 木里| 大竹县| 洛阳市| 青州市| 澄迈县| 信阳市| 区。| 米泉市| 海晏县| 呼图壁县| 乌拉特前旗| 东明县| 简阳市| 阳山县| 台江县| 湘西| 宝鸡市| 平湖市| 巴中市| 板桥市| 黄山市| 鄂托克前旗| 龙门县| 常德市| 稻城县| 营口市| 临猗县| 宜宾市| 惠安县| 三穗县|