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

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

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

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

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

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

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

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

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

問題的來龍去脈

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

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

在上層的領域服務中,有一處調用這個方法的代碼,具體如下:nYT28資訊網——每日最新資訊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); 這行代碼非常詭異nYT28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

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

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

首先,先把問題描述清楚,ChatGPT 特懂人情世故,你跟他講清楚問題,他也會給你一個清楚的答案。nYT28資訊網——每日最新資訊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;}

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

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

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

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

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

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

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

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

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

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

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

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

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

背后的原因

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 沂源县| 来安县| 吉林省| 蛟河市| 临安市| 泗水县| 抚松县| 明光市| 周口市| 武强县| 洛宁县| 股票| 丰城市| 丹江口市| 顺义区| 新巴尔虎左旗| 黄山市| 张家界市| 荔浦县| 新龙县| 玉门市| 峨眉山市| 潞西市| 大邑县| 日土县| 普宁市| 广德县| 义乌市| 闻喜县| 宾川县| 大冶市| 南投市| 胶州市| 历史| 濉溪县| 盖州市| 昌邑市| 怀柔区| 吉水县| 陆丰市| 阿图什市|