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到了吗?的更多相关文章

  1. 应用服务器中对JDK的epoll空转bug的处理

    原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...

  2. JDK中的并发bug?

    最近研究Java并发,无意中在JDK8的System.console()方法的源码中翻到了下面的一段代码: private static volatile Console cons = null; / ...

  3. 给JDK提的一个bug(关于AbstractQueuedSynchronizer.ConditionObject)

    1. 背景 之前读JUC的AQS源码,读到Condition部分,我当时也写了一篇源码阅读文章--(AbstractQueuedSynchronizer源码解读--续篇之Condition)[http ...

  4. jdk 10.0.2 bug修复

    之前记录过jdk9+版本的1个bug,某些情况下会导致方法执行二遍,今天早上打开笔记本(mac),弹出一个框提示jdk升级10.0.2,顺手点了一下,然后验证了下该bug,发现居然fix掉了,推荐大家 ...

  5. 发现JDK的3个bug

    1.Annotation引用非空enum数组返回空数组 首次发现时的环境:JDK 1.8 首次发现所在项目:APIJSON 测试用例: public enum RequestRole { /**未登录 ...

  6. IDEA光标跟随原因是jdk载入的问题BUG 修正 需要I安装最新版本1.8JDK 1.9之后的不清楚 谨慎

    解决方法是 选择jdk本地版本 重启就好了 https://blog.csdn.net/Utopia_Zq/article/details/81190300?utm_source=blogxgwz2 ...

  7. JDK的小Bug你了解么?

    ​用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨,依然坚持在一线上,是不是感觉很神奇,但是,有没有多 ...

  8. 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。

    你好呀,我是歪歪. 前段时间在 RocketMQ 的 ISSUE 里面冲浪的时候,看到一个 pr,虽说是在 RocketMQ 的地盘上发现的,但是这个玩意吧,其实和 RocketMQ 没有任何关系. ...

  9. Java中关于 BigDecimal 的一个导致double精度损失的"bug"

    背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public ...

随机推荐

  1. POJ 3735:Training little cats 联想到矩阵相乘

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11208   Accepted:  ...

  2. Percona-Toolkit 之 pt-archiver 删除历史数据

    pt-archiver是Percona-Toolkit工具集中的一个组件,是一个主要用于对MySQL表数据进行归档和清除工具.它可以将数据归档到另一张表或者是一个文件中.pt-archiver在清除表 ...

  3. TP框架数据模型

    1.TP框架的数据模型需要建在Model文件夹下: 1.数据模型 与控制器相似,但是每个数据模型控制一张数据表. 2.数据模型可写可不写,如果不写 则沿用父类数据模型. 2.访问数据库: 1.更改数据 ...

  4. JavaScript 对象所有API解析【2020版】

    JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...

  5. read和write函数的使用

    https://blog.csdn.net/qq_33883085/article/details/88667003

  6. SQL语句对MySQL数据库的操作之对数据库层面的操作

    一.数据库内部存储结构 字段->数据表->数据库->MySQL服务器 二.登录及退出数据库 mysql -h服务器地址 -u用户名 -p密码(这样的登录形式并不安全) mysql - ...

  7. 2.13 ViewModel 使数据即使在后台被杀死数据也能存活

    操作程序如下: 主要是创建一个 SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活 MyVIewModel: package com.example. ...

  8. 一百零一、SAP中ALV事件之十四,让ALV表格自动排序

    如果我们需要对下图的凭证日期和物料进行排序,需要怎么做呢 一.我们来到ALV的定义 二.我们查看IT_SORT的定义,双击点进去 三.查看SLIS_T_SORTINFO_ALV定义 四.代码如下,定义 ...

  9. 四、JavaScript之<script>标签的使用

    一.代码如下 二.运行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...

  10. 159-PHP strstr函数,取最后几个字符和除去最后几个字符

    <?php $str='programming'; //定义一个字符串 $res=substr($str,-4); //处理字符串 echo "返回{$str}字符串的最后4个字符{$ ...