摘要: 原创出处 my.oschina.net/tommylemon/blog/2967187 「孤独的探索号」欢迎转载,保留摘要,谢谢!
1. Annotation引用非空enum数组返回空数组
首次发现时的环境:JDK 1.8
首次发现所在项目:APIJSON
测试用例:
public enum RequestRole { UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN; public static final RequestRole[] ALL = {RequestRole.UNKNOWN}; public static final RequestRole[] HIGHS; static { HIGHS = new RequestRole[] {OWNER, ADMIN}; } public static final String[] NAMES = { UNKNOWN.name(), LOGIN.name(), CONTACT.name(), CIRCLE.name(), OWNER.name(), ADMIN.name() }; } @MethodAccess ( GETS = RequestRole.ALL, HEADS = RequestRole.HIGHS ) public class Verify {} public class DemoVerifier { public static final Map<String, Map<RequestMethod, RequestRole[]>> ACCESS_MAP; static { ACCESS_MAP = new HashMap<String, Map<RequestMethod, RequestRole[]>>(); ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); } public static HashMap<RequestMethod, RequestRole[]> getAccessMap(MethodAccess access) { if (access == null ) { return null ; } HashMap<RequestMethod, RequestRole[]> map = new HashMap<>(); 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()); return map; } }
解决方案:
不抽象数组常量ALL,HIGHTS等,而是在每个用到的地方硬编码写死具体的值。
2. ArrayList可通过构造函数传入非指定泛型的List并在get时出错
首次发现时的环境:JDK 1.7
首次发现所在项目:APIJSON
测试用例:
JSONArray arr = new JSONArray(); arr.add("s" ); List<Long> list = new ArrayList<>(arr); list.get(0 );
解决方案:
1.改用 Open JDK8
2.升级 JDK
注:后面多次测试,已无法复现。
3.基本类型在三元表达式内可赋值为null,编译通过但运行出错
首次发现时的环境: JDK 1.7
测试用例:
首次发现所在项目:ZBLibrary
解决方案:
在给基础类型用3元表达式赋值时,null 先转为基础类型的默认值。
最后再提2个不是bug,但容易引发编程bug的问题
** 1、局部变量和同名的全局变量能在一个方法内,编译通过,运行也正常。**
public class Test { int val; @Override public String toString () { val = 1 ; String val = "" ; return super .toString(); } }
如果两个变量中间隔了比较长的其它代码,很可能会导致开发人员将两者混淆,导致逻辑认知错误,从而写出或改出有问题的代码。
解决方案:
命名局部变量前先搜素,确保没有已声明的同名全局变量。
** 2、(非 JDK bug)Gson 通过 TypeToken 转换 List<T> 能写入不属于 T 类型的数据,get 出来赋值给 T 类型的变量/常量报错。**
String json = "[1, '2', 'a']" ; Type type = new TypeToken<Integer>(){}.getType(); Gson gson = new Gson(); List<Integer> list = gson.fromJson(json, type); Integer i = list == null || list.isEmpty() ? null : list.get(1 );
解决方案:
1.手动检查列表内数据都符合泛型 T
2.改用 fastjson 等其它能静态检查类型的库。