Java日常踩坑总结

2018-12-08  本文已影响4人  Moine0828

1、ASM ClassReader failed to parse class file

这个问题百度上很常见,一般来说就是spring的版本和jdk的版本不兼容。如果是这样的话,检查一下两个版本就好了,一般spring4.0需要jdk1.8以上的版本才能适配。

但是今天本地IDEA启动项目时报了这个错,检查了spring和jdk的版本都没有问题。百度不到答案之下,仔细思考,猜测可能是因为项目刚刚升级到jdk1.8,本地文件存在一些缓存导致的。删除项目的target目录,重新启动,果然错误就消失了。因此在本地开发环境出现这种报错,除了版本真的不兼容之外,还存在版本升级之后有一些缓存目录导致幻觉的可能。

2、Java8的流,使用需谨慎

最近把项目jdk版本升级到了1.8,众所周知Jdk8对于集合处理有一个很友好的更新,那就是引入了流的操作。例如大家都很头疼的list转map再也不用傻傻的写for循环了。

升级时的我也是这么想的,正常情况下当然改写成stream的写法没有任何问题。当天部署之后正好公司在进行全链路的压测,我维护的系统中有一个接口在交易主链路上是必走的,压测时在这个接口上出了大问题,50个线程时就有90%的错误率。

这其实很不正常,首先这个接口是久经考验的,上线之后一直被压测,从未崩溃过,性能表现一直很好。其次我并没有对这个接口做过逻辑的改动,只是加了一些流的写法取代了原先的for循环。

查看日志发现问题真的出在了java8的流操作,在调用Collectors.toMap()方法对list转换成map时抛出了空指针。

查看Collectors.toMap方法的源码

toMap方法调用的是map.merge方法,而hashmap的merge方法第一句就是对value为null的情况抛了异常

merge方法是jdk1.6中并没有,我猜测是为了流操作才加入的。众所周知stream是惰性求值,开启多个线程对list进行操作最后不可能再调用map的put方法。至于为什么put方法不判断value为null而merge方法要做这个校验,目前还没有想明白。

上一篇 下一篇

猜你喜欢

热点阅读