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 ...
随机推荐
- Robot set variable if
${strid} Set Variable If '${row}' =='2' LFFD_TANK_RAMP ... '${row}' =='3' LFFD_TANK_LANDING
- Wordpress自动更新失败
Wordpress自动更新失败 一.手动升级Wordpress教程第一步:备份好Wordpress数据 在决定手动升级Wordpress前,你需要做好Wordpress的数据备份工作,以防手动升级失败 ...
- HDU - 1394 Minimum Inversion Number(线段树求逆序数---点修改)
题意:给定一个序列,求分别将前m个数移到序列最后所得到的序列中,最小的逆序数. 分析:m范围为1~n,可得n个序列,求n个序列中最小的逆序数. 1.将序列从头到尾扫一遍,用query求每个数字之前有多 ...
- 聚类之K均值聚类和EM算法
这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...
- HDU 4901 多校4 经典计数DP
RT 最近不想写博客,累积了一周多的题目,今天趁着周日放假,全部补上吧 dp[i][j]表示前i个数,操作后的值为j的总个数 注意取或不取,有种完全背包的意味.因为数字小于1024,所以异或的结果也绝 ...
- class(一)--类的创建
class是ES6引入的,它并不是一种全新的继承模式,而只是基于原型对象继承封装的语法糖,因此只要充分理解原型对象,原型链,继承等知识,class也就很好容易理解了 类的声明 ES5及之前是通过创建一 ...
- Docker 镜像(image)
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- hdu4632 Palindrome subsequence 回文子序列个数 区间dp
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- Mysql :分支结构—if函数
一分支结构 1.if函数 功能:实现简单的双分支 语法: IF (表达式1,表达式2,表达式3) 执行顺序 如果表达式1成立 则if函数返回表达式2的值,否则返回表达式3的值 应用: 任何地方
- apt-get install oracle-java8-installer时Err:7 http://ppa.launchpad.net/webupd8team/java/ubuntu xenial/main amd64 Packages 404 not found
所有其他网址都有效,而不是amd64端点. 然后,当运行apt-get install oracle-java8-installer时,出现以下错误: Package oracle-java8-ins ...