JDK的3個bug啊,你get到了嗎?

1.Annotation引用非空enum數組返回空數組

首次發現時的環境:

JDK 1.8

首次發現所在項目:APIJSON

測試用例:

<code>publicenumRequestRole {/**未登錄,不明身份的用戶*/UNKNOWN,/**已登錄的用戶*/LOGIN,/**聯繫人,必須已登錄*/CONTACT,/**圈子成員(CONTACT + OWNER),必須已登錄*/CIRCLE,/**擁有者,必須已登錄*/OWNER,/**管理員,必須已登錄*/ADMIN;//似乎不管怎麼做,外部引用後都是空值。並且如果在註解內的位置不是最前的,還會導致被註解的類在其它類中import報錯。//雖然直接打印顯示正常,但被@MethodAccess內RequestRole[] GET()等方法引用後獲取的是空值publicstaticfinal RequestRole[] ALL = {RequestRole.UNKNOWN};//values();//所有publicstaticfinal RequestRole[] HIGHS;//高級static{HIGHS =newRequestRole[] {OWNER, ADMIN};}publicstaticfinal String[] NAMES = {UNKNOWN.name(), LOGIN.name(), CONTACT.name(), CIRCLE.name(), OWNER.name(), ADMIN.name()};}@MethodAccess(GETS = RequestRole.ALL,HEADS = RequestRole.HIGHS)publicclassVerify{}publicclassDemoVerifier{// <tablename>>// <user>>publicstaticfinal Map<string>> ACCESS_MAP;static{//註冊權限ACCESS_MAP =newHashMap<string>>();ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class)));}publicstaticHashMap<requestmethod> getAccessMap(MethodAccess access) {if(access == null) {returnnull;}HashMap<requestmethod>map=newHashMap<>();map.put(GET, access.GET());map.put(HEAD, access.HEAD());map.put(GETS, access.GETS());map.put(HEADS, access.HEADS());map.put(POST, access.POST());map.put(PUT, access.PUT());map.put(DELETE, access.DELETE());returnmap;}}/<requestmethod>/<requestmethod>/<string>/<string>/<user>/<tablename>/<code>


解決方案:

不抽象數組常量ALL,HIGHTS等,而是在每個用到的地方硬編碼寫死具體的值。

2.ArrayList可通過構造函數傳入非指定泛型的List並在get時出錯

首次發現時的環境:JDK 1.7

首次發現所在項目:APIJSON

測試用例:

JDK的3個bug啊,你get到了嗎?

解決方案:

1.改用 Open JDK8

2.升級 JDK

注:後面多次測試,已無法復現。

3.基本類型在三元表達式內可賦值為null,編譯通過但運行出錯

首次發現時的環境:JDK 1.7

測試用例:

<code>int i =true?null:0;//Exceptioninthread"main"java.lang.NullPointerException/<code>

首次發現所在項目:ZBLibrary

解決方案:

在給基礎類型用3元表達式賦值時,null 先轉為基礎類型的默認值。

最後再提2個不是bug,但容易引發編程bug的問題:

1.局部變量和同名的全局變量能在一個方法內,編譯通過,運行也正常。

JDK的3個bug啊,你get到了嗎?

如果兩個變量中間隔了比較長的其它代碼,很可能會導致開發人員將兩者混淆,導致邏輯認知錯誤,從而寫出或改出有問題的代碼。

解決方案:

命名局部變量前先搜素,確保沒有已聲明的同名全局變量。

2. (非 JDK bug)Gson 通過 TypeToken 轉換 List 能寫入不屬於 T 類型的數據,get 出來賦值給 T 類型的變量/常量報錯。

JDK的3個bug啊,你get到了嗎?

解決方案:

1.手動檢查列表內數據都符合泛型 T

2.改用 fastjson 等其它能靜態檢查類型的庫。


分享到:


相關文章: