image.png 记录最近遇到的一些坑点,分享给常在河边走的你。 1、老师告诉我分母不能是0。 场景:项目有个功能是竞猜功能,竞猜需要的金币是根据公式: M+ N*0.5/ diffDays。M是根据玩家等级策划配置的值,N是某一天到当前时间的收入总和,diffDays 是收入的天数。 在测试的时候,测试的同学发现在玩家有14亿的金币仍然不能竞猜,这很奇怪。经过调试发现diffDays 为0,为什么除0不报错呐?老师告诉我的不对吗? 难受。 image.png

原因:double类型数据直接除0,0会向上转型为double,变为0.0,0.0在内存不是0,而是一个不精确的数,可能是0.000000000001或其它,所以一个正数除以0.0结果就得很大很大。所以返回了Long的最大值。 2、switch 为什么一定要加break? 场景:在写一个gm命令的时候将一个功能的gm全部定义进了一个协议内,通过case 进行区分操作,想当然的一位 {} 就是语句的结束,出现了多个case同时执行的情况。代码如下 image.png

探索一下为什么?想要知道为什么一切还要从源头说起:字节码 image.png 可以看到switch case 被编译成Lookupswitch ,两个case 被编译为L2,L3 ,并且自动添加了default L4。 接下来看下加入break 会做什么? image.png image.png

加入break 之后,在L2 之后补上了L5,GOTO L4 ,L4 直接执行了18行,也就是程序的结束,不再执行下面的case。 除了Lookupswitch 还有 tableswitch ,具体的区别 你知道吗?下期再说哦。 3、Java8 的stream 和 limit 场景:最近有个功能是记录竞技场的前三名的玩家信息,但是只保留近5个赛季的,多余的则删除。写出了以下的代码: image.png 运行的结果是: image.png 妈耶:完全不是我设想的5个赛季,蛋疼。分析下原因:Java8 的写了不少了,但是有些函数还是有些想当然了。因为这个集合里有season 有多个数据,在最后进行limit 的时候取5个,最终只取到了8和9,怎么解决呐?解决重复数据当然用distinct。

image.png https://mp.weixin.qq.com/s/8pWUaeCB_B5rRnrC8DCVVg