JDK的3个bug啊,你get到了吗?
1.Annotation引用非空enum数组返回空数组
首次发现时的环境:JDK 1.8
首次发现所在项目:APIJSON
测试用例:
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, <METHOD, allowRoles>>// <User, <GET, [OWNER, ADMIN]>>publicstaticfinal Map<String, Map<RequestMethod, RequestRole[]>> ACCESS_MAP;static{//注册权限ACCESS_MAP =newHashMap<String, Map<RequestMethod, RequestRole[]>>();ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class)));}publicstaticHashMap<RequestMethod, RequestRole[]> getAccessMap(MethodAccess access) {if(access == null) {returnnull;}HashMap<RequestMethod, RequestRole[]>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;}}
解决方案:
不抽象数组常量ALL,HIGHTS等,而是在每个用到的地方硬编码写死具体的值。
2.ArrayList可通过构造函数传入非指定泛型的List并在get时出错
首次发现时的环境:JDK 1.7
首次发现所在项目:APIJSON
测试用例:
解决方案:
1.改用 Open JDK8
2.升级 JDK
注:后面多次测试,已无法复现。
3.基本类型在三元表达式内可赋值为null,编译通过但运行出错
首次发现时的环境:JDK 1.7
测试用例:
int i =true?null:0;//Exceptioninthread"main"java.lang.NullPointerException
首次发现所在项目:ZBLibrary
解决方案:
在给基础类型用3元表达式赋值时,null 先转为基础类型的默认值。
最后再提2个不是bug,但容易引发编程bug的问题:
1.局部变量和同名的全局变量能在一个方法内,编译通过,运行也正常。
如果两个变量中间隔了比较长的其它代码,很可能会导致开发人员将两者混淆,导致逻辑认知错误,从而写出或改出有问题的代码。
解决方案:
命名局部变量前先搜素,确保没有已声明的同名全局变量。
2. (非 JDK bug)Gson 通过 TypeToken 转换 List<T> 能写入不属于 T 类型的数据,get 出来赋值给 T 类型的变量/常量报错。
解决方案:
1.手动检查列表内数据都符合泛型 T
2.改用 fastjson 等其它能静态检查类型的库。
推荐:开化县属于哪个市?
JDK的3个bug啊,你get到了吗?的更多相关文章
- 应用服务器中对JDK的epoll空转bug的处理
原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...
- JDK中的并发bug?
最近研究Java并发,无意中在JDK8的System.console()方法的源码中翻到了下面的一段代码: private static volatile Console cons = null; / ...
- 给JDK提的一个bug(关于AbstractQueuedSynchronizer.ConditionObject)
1. 背景 之前读JUC的AQS源码,读到Condition部分,我当时也写了一篇源码阅读文章--(AbstractQueuedSynchronizer源码解读--续篇之Condition)[http ...
- jdk 10.0.2 bug修复
之前记录过jdk9+版本的1个bug,某些情况下会导致方法执行二遍,今天早上打开笔记本(mac),弹出一个框提示jdk升级10.0.2,顺手点了一下,然后验证了下该bug,发现居然fix掉了,推荐大家 ...
- 发现JDK的3个bug
1.Annotation引用非空enum数组返回空数组 首次发现时的环境:JDK 1.8 首次发现所在项目:APIJSON 测试用例: public enum RequestRole { /**未登录 ...
- IDEA光标跟随原因是jdk载入的问题BUG 修正 需要I安装最新版本1.8JDK 1.9之后的不清楚 谨慎
解决方法是 选择jdk本地版本 重启就好了 https://blog.csdn.net/Utopia_Zq/article/details/81190300?utm_source=blogxgwz2 ...
- JDK的小Bug你了解么?
用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨,依然坚持在一线上,是不是感觉很神奇,但是,有没有多 ...
- 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。
你好呀,我是歪歪. 前段时间在 RocketMQ 的 ISSUE 里面冲浪的时候,看到一个 pr,虽说是在 RocketMQ 的地盘上发现的,但是这个玩意吧,其实和 RocketMQ 没有任何关系. ...
- Java中关于 BigDecimal 的一个导致double精度损失的"bug"
背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public ...
随机推荐
- Java 日期与时间
章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...
- mybatis-plus 乐观锁
参见:https://mp.baomidou.com/guide/optimistic-locker-plugin.html#%E4%B8%BB%E8%A6%81%E9%80%82%E7%94%A8% ...
- LeetCode160 相交链表(双指针)
题目: click here!!题目传送门 思路: 1.笨方法 因为如果两个链表相交的话,从相交的地方往后是同一条链表,所以: 分别遍历两个链表,得出两个链表的长度,两个长度做差得到n,然后将长的链表 ...
- Python3 格式化输出
Python3 格式化输出 今天用字符串功能的时候,我突然忘记了格式化输出的方式X﹏X.所以赶紧恶补一下. 1.打印字符串 print("My name is %s" %(&quo ...
- c#查看本机网络端口和对应的程序名
360安全卫士里面有个组件叫流量防火墙,感觉挺好用,但是不想安装360全家桶,于是自己捣鼓着用C#写一个比较简化的版本. 查看电脑上开启的TCP或UDP端口,可以用netstat命令,netstat用 ...
- 一百一十四、SAP查看事务代码对应工程源码
一.比如我们想看ZMMR008的源码,输入事务代码,点击显示 二.点击显示之后,在程序这儿,的双击打开 三.可以看到源码内容
- RPC——看这一篇就…显然不够
引言 RPC blablabla…… RPC 知识点 扩展 有给老婆解释的如:https://www.jianshu.com/p/2accc2840a1b
- 19 01 15 js 尺寸相关 滚动事件
尺寸相关.滚动事件 1.获取和设置元素的尺寸 width().height() 获取元素width和height innerWidth().innerHeight() 包括padding的width和 ...
- C语言-逃逸字符、类型转换和布尔类型
C语言-逃逸字符 逃逸字符是用来表达无法印出来的控制字符或者特殊字符,它由一个反斜杠""开头,后面跟上另一个字符,这两个字符合起来,组成一个字符. \b是backspace,在su ...
- sql 常用的语句(sql 创建表结构 修改列 清空表)
1.创建表 create Table WorkItemHyperlink ( ID bigint primary key ,--主键 WorkItemID ,) not null,--其中identi ...