用了这么长时间的JDK你发现bug了吗?

用了这么长时间的JDK了,有没有老铁发现JDK的bug呢?从最早版本的JDK1.2到现在普及开的JDK1.8以来,JAVA经历了这么多年的风风雨雨, 依然坚持在一线上,是不是感觉很神奇,但是,有没有多少人去主动的去看JDK的源码?还有你写好的代码编译出来的class类,有多少兄弟们 去看这里面的内容呢?公司老大让我加了一点功能,然后编译成class类,我发现里面的代码和我写的竟然不一样,人家那排版做的,两个字 “完美”。于是突发奇想,看看JDK有没有什么BUG来让我们娱乐一下,于是就写下了这么一篇文章来记录自己的心得体会!

兴趣来了,这就有继续的欲望了,我就开始查资料并且自己手动做了测试下面我们就来汇总一下这些存在在我们开发中的一些些小小的BUG吧

JDK的Bug1–数组切割

字符串的分割,大家都用过把,split这个方法大家应该都熟悉的,但是有没有人去试过这个split去通过点来进行切割的时候会出现什么问题呢? 我们做个测试具体代码图如下:

在我们的印象中打印的结果肯定是3,但是实际情况和我们想的却完全的不一样,

打印结果却是0,但是相同的情况下我们是用其他的符号去进行切割呢?

这次打印结果却是和我们记忆中的结果完全相符了。

打印结果却是三,这是JDK的一个bug,我也不知道他为什么对点是这么的独特,难道是传统的偏爱?

所以在此得提醒做开发的各位小伙伴了,我们在使用字符串的split的时候,尽量的不要去使用点,也就是“.” ,否则你会发现有时候写了半天的代码,你自己竟然都不知道错误竟然是因为JDK的一个小的Bug所引起来的, 那时候估计你想把高斯林弄死的心都有。当然了,我是使用的现在用的最多的JDK1.8,如果说JDK1.8之后的版本, 对这个进行修复的话,各位大哥能给我提个醒也成,感谢!

JDK的Bug2–三元运算符

基本数据类型的三元运算符是可以赋值为Null的,编辑器是不会给我们报错的,但是 当程序运行的时候就会出现错误了,我们来看一下代码展示

在我们编辑代码的时候是一点不出错,但是当我们条件成立的时候就会有这种错误。

其实这个错误很容易理解,为什么呢?三元运算符,哪有这么搞得,很少会出现这种不符合常理的错误,这只能说写代码的兄弟思路很开阔,但是 也不排除会有这种情况的出现。所以得长点心,不能瞎搞不是?

JDK中不算Bug的Bug–ArrayList可通过构造函数传入非指定泛型的List并在get时出错

为什么标题会写不算Bug的Bug呢?因为这个比上面的还离谱。这是网上的网友发现的。

我们可以先看看代码展示

1
2
3
4
5
6
7

    JSONArray arr = new JSONArray(); //com.alibaba.fastjson.JSONArray
    arr.add("s");

    List<Long> list = new ArrayList<>(arr); 
    list.get(0); //Exception cannot cast String to Long

在看到这段代码的第一时间,我就想弄死这个写代码的兄弟,你前面的泛型和后边的传入的非指定的这种,好像没有人会这么写吧, 不过后来想了一下,也不能弄死人家不是,这代码确实不报错呀!想来想去,还是觉得兄弟你有理,这个确实属于一个Bug, 但是这是写代码的人不怎么会遇到的错误问题。所以我把它放到了第三个。

##总结

总结起来其实蛮简单的,JDK我们用了这么多年,毕竟也算是稳定的很,作为一个开发者,要去尝试一下这些好玩的东西,说不定什么时候就能 自己模仿出一个JDK来也说不定不是,所以Bug很多时候都是自己写出来的,作为一个合格的开发者要把自己的代码写的简单,逻辑严谨, 少出一些笑话,实现功能就可以了。

希望各位干程序员的老铁们,继续一直坚持下去。

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。