亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IDEA?Debug問題怎么解決

發布時間:2023-01-09 09:26:05 來源:億速云 閱讀:149 作者:iii 欄目:開發技術

這篇文章主要講解了“IDEA Debug問題怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“IDEA Debug問題怎么解決”吧!

問題引入

最近看了 eclipse 開源的集合 Eclipse Collections,覺得它的 api 相比 JDK 集合 api 簡潔,想在實際項目中使用,如下。

JDK api

 // users is List<String> 
 users.stream.map(user -> user.getName()).collect(Collectors.toList());

Eclipse Collections api

 //users is MutableList
 users.collect(user -> user.getName);

項目實際開發中使用集合最多的地方還是來自數據庫查詢,如下。

JDK api

List<User> findByCity(String city);

我想改成

MutableList<User> findByCity(String city);

然而報錯了

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.util.ArrayList<?>] to type [org.eclipse.collections.api.list.MutableList<?>] for value '[]'; nested exception is java.lang.IllegalArgumentException: Unsupported Collection interface: org.eclipse.collections.api.list.MutableList
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175)

太長不看直接結論是改成下列代碼。

FastList<User> findByCity(String city);

Debug

對代碼簡單分析

報錯的地方都是 Spring 的包,證明我們使用的 Spring Data JPA 訪問數據庫,事實上也是。

查看類名稱,方法名稱。 有 convert.ConversionFailedException/convert.support.ConversionUtils.invokeConverter/convert.support.GenericConversionService.convert等等,關鍵詞 convert,我應該聯想到這段代碼的功能是把什么類型 convert 到什么類型。

再分析報錯的那一行我們會更清晰一點。

  • result 是轉換的結果。

  • converter是轉換器,結合上面的結論,這個類肯定是真正執行轉換的類,我們要的核心代碼肯定在這里,如果你直接去看的話,它肯定是一個接口,面向接口編程。

  • sourceType 源類型,結合上述分析肯定是原始類型。

  • targetType 目標類型,同上不贅述。

打斷點

IDEA 可以直接點擊報錯 class 定位到源文件,這里我們先點擊 ConversionFailedException ,再點擊 ConversionUtils.java:47,發現都是報錯的異常,對我們沒有幫助。最后我們點擊 GenericConversionService.java:192,終于看到一行代碼了。

Object result = 
    ConversionUtils.invokeConverter(converter, source, sourceType, targetType);

斷點分析

執行過程會停留在斷點處,我們可以查看上下文變量類的實例。這里我們以 converter 為例。按照數字步驟點擊,如下。

IDEA?Debug問題怎么解決

可能的 converter 如下:

1. java.lang.String -> java.lang.Enum
2. NO_OP
3. java.lang.Boolean -> java.lang.String
// 等等。。。。。

由于是底層方法,被調用的次數很多,在這個斷點停留的次數也很多。很多次不是我們想要的 converter

條件斷點

顧名思義 IDEA 會通過我們添加的條件來判斷這個斷點是否需要被處理。

我們想要的 converter 是什么呢?回到代碼分析階段,我們想要的 convertersourceType &rarr; targetTypetargetType 類型是什么呢?回到我們自己寫的代碼。

MutableList<User> findByAdress(String address);

可以看到我們需要 targetTypeMutableList class。

下面添加條件斷點:

IDEA?Debug問題怎么解決

完整的條件如下:

MutableList.class.isAssignableFrom(targetType.getType());

添加成功的標志如下。

IDEA?Debug問題怎么解決

單步調試

Debug 模式啟動程序,可以看到 IDEA 停留在我們的條件斷點上,并且targetType 的類型正是 MutableList

IDEA?Debug問題怎么解決

單步調試代碼,來到 org.springframework.core.CollectionFactory#createCollection 方法。

部分代碼如下:

//省略的代碼
// 判斷集合類型是不是 ArrayList 或者 List,顯然這里不是
else if (ArrayList.class == collectionType || List.class == collectionType) {
  return new ArrayList<>(capacity);
}
//省略的代碼
else {
//如果是集合類型的接口 或者 不是集合類型拋出異常
  if (collectionType.isInterface() || !Collection.class.isAssignableFrom(collectionType)) {
    throw new IllegalArgumentException("Unsupported Collection type: " + collectionType.getName());
  }
  try {
  //如果是集合類型的類,直接通過反射實例化。
    return (Collection<E>) ReflectionUtils.accessibleConstructor(collectionType).newInstance();
  }
}

重回代碼分析

我們的 targetType 的類型正是 MutableList,而 MutableList 是接口,走讀代碼可以發現最終會執行下面的代碼,最終導致拋出異常。

if (collectionType.isInterface() || !Collection.class.isAssignableFrom(collectionType)) {
    throw new IllegalArgumentException("Unsupported Collection type: " + collectionType.getName());
  }

翻看控制臺找到了下面的異常信息,這也側面反映我們之前找的報錯位置不是很精確。我們尋找異常時應該選擇最原始的異常信息。

Caused by: java.lang.IllegalArgumentException: Unsupported Collection type: org.eclipse.collections.api.list.MutableList
	at org.springframework.core.CollectionFactory.createCollection(CollectionFactory.java:205)
	at org.springframework.core.convert.support.CollectionToCollectionConverter.convert(CollectionToCollectionConverter.java:81)

繼續分析源碼可以發現,如果我們定義的類型不是接口,JPA 就會通過反射創建集合,即如下代碼:

return (Collection<E>) ReflectionUtils.accessibleConstructor(collectionType).newInstance();

所以我們只需要將 MutableList 換成它的實現類即可,比如 FastList。最終代碼如下:

FastList<User> findByCity(String city);

感謝各位的閱讀,以上就是“IDEA Debug問題怎么解決”的內容了,經過本文的學習后,相信大家對IDEA Debug問題怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

余姚市| 衡山县| 镇宁| 二连浩特市| 安康市| 德保县| 吕梁市| 从江县| 黑水县| 米林县| 依兰县| 宁国市| 双牌县| 平谷区| 金寨县| 平江县| 芒康县| 河津市| 中江县| 江陵县| 北流市| 仁寿县| 屏南县| 桑植县| 长寿区| 灵川县| 柳江县| 抚远县| 同江市| 墨竹工卡县| 绿春县| 和龙市| 宁强县| 阜新市| 资阳市| 鄂伦春自治旗| 赣州市| 神木县| 辽阳县| 郧西县| 石楼县|