美文网首页
Java日常踩坑总结

Java日常踩坑总结

作者: Moine0828 | 来源:发表于2018-12-08 14:38 被阅读4次

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方法要做这个校验,目前还没有想明白。

相关文章

  • Java日常踩坑总结

    1、ASM ClassReader failed to parse class file 这个问题百度上很常见,一...

  • classpath

    前言 java web项目中的 classpath 很重要,以下为踩过不少坑后的总结。 一、 classpath ...

  • Flutter 开发记录

    Flutter 开发踩坑记录(干货总结)

  • 日常踩坑

    12.24日 写在18年的尾巴上~ 在React中,如果你render一个元素,给他绑定了一个方法,那么不要直接在...

  • 踩坑日常

    基本推送流程 克隆远程仓库到本地仓库:git clone 仓库地址(ssh/http)本地仓库连接远程仓库:git...

  • 个人博客标签分类

    【小结】零碎的小结 【踩坑记录】报错等记录,防止再度踩坑 【总结】比较完整的总结 【想法】自己的一些想法和推论 【...

  • 知识分享之Java——AOP中执行顺序

    知识分享之Java——AOP中执行顺序 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)...

  • 日常bug记录

    想记录日常碰到的bug,坑踩多了,以后应该碰到坑就比较容易处理或者会少踩坑,后面会慢慢记录bug,截图bug以及最...

  • 知识分享之Java——Maven常用命令

    知识分享之Java——Maven常用命令 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰...

  • 知识分享之Java——常用的类型转换

    知识分享之Java——常用的类型转换 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o...

网友评论

      本文标题:Java日常踩坑总结

      本文链接:https://www.haomeiwen.com/subject/nwsqhqtx.html