消灭空指针,Java8给我们更好的解决方案
前言
在平时的业务开发中,空指针是我们经常遇到的问题,
他可能会导致我们的流程无法正常进行或者一些意外情况的发生。
这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢?空指针场景包装类型字段,因为自动拆箱出现空指针;A对象包含B对象,通过A对象获取B对象字段时,没有判断就直接去调用B对象中的方法出现空指针;字符串比较,null。equal(字符串)出现空指针远程返回的List不是空数组而是null,对其进行操作出现空指针。线上空指针问题如何排查
日常的开发过程中,一般情况下我们都是通过查看日志来排查空指针的问题,如果日志没有做到位的情况下,我们只能通过NullPointerException抛出的位置去跟踪代码。
这就要求我们,在写代码的时候做好日志的打印调用方法的入口进行入参的打印,方法返回的结果进行出参打印
如果没有提前做好日志打印,那我们可以考虑利用阿里的Java诊断工具Arthas来处理Arthas启动后,获取来了JVM进程通过watch指令来监测方法的入参情况思考
对于这个问题,我总结了一些我在工作中使用到的方法,
最直接的操作都是从根源上消灭出现空指针的可能性,进行先判空再操作。
下面拿商品信息作为一个例子,我们要得到他店铺的名称,你会怎么写DatapublicclassProductVOimplementsSerializable{ApiModelProperty(skuId)privateLongskuId;ApiModelProperty(商品名称)privateStringname;ApiModelProperty(品牌名)privateStringbrandName;ApiModelProperty(库存)privateIntegerquantity;ApiModelProperty(小图列表)privateListStringsmallImgUrls;ApiModelProperty(店铺信息)privateShopVOshop;
防御性检查,每一个变量都做一次null检查,每一次不确定一个变量是否为null时,都需要添加一个嵌套的if块,这增加了代码的层数。获取店铺名称privateStringgetShopName1(ProductVOproductVO){if(productVO!null){ShopVOshopproductVO。getShopVO();if(shop!null){returnshop。getName();}}return;}
快速失败检查,每一个null检查都是一个退出点,都返回一个固定的字符串,但是不能避免的是,忘记对某一个变量的检查。获取店铺名称privateStringgetShopName2(ProductVOproductVO){Stringresult;if(Objects。isNull(productVO)){returnresult;}ShopVOshopproductVO。getShopVO();if(Objects。isNull(shop)){returnresult;}returnshop。getName();}
人为控制,对数据进行严格的控制,不能存在非空字段,但是不能很难保证所有数据都是正常的数据
利用Java8中的optional来做控制,对缺失的值建模,变量存在时对类进行简单的封装,不存在时,缺失的值会被建模成一个空的Optional对象privatestaticStringgetName4(ProductVOproductVO){returnOptional。ofNullable(productVO)。flatMap(dataOptional。ofNullable(data。getShopVO()))。map(ShopVO::getName)。orElse();}创建一个Optional封装的ProductVO对象将Optional转换为Optional利用map,将Optianal转换为Optional调用链上的任何一个方法,返回一个空,那么结果就是我们设置的默认值
上面的几种方法中,我们看到了第四种方法,只用了一行代码就帮我们实现了消灭空指针的动作,但是Java8中的Optional需要结合多个的方法来使用他,现在网上已经有很多详细方法文章,就不再做过多的介绍。注意Stream中flatMap与Map的区别
对于Stream流的运算中,flatMap与Map是我们常使用到的方法,很多人都没有搞清楚他们的差别是什么。
map():map对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。
flatMap():flatMap是一种常用的组合子,结合映射〔mapping〕和扁平化〔flattening〕。flatMap需要一个处理嵌套列表的函数,然后将结果串连起来。
举个例子,一眼看出他们的区别ListStringlistArrays。asList(北京天安门,上海东方明珠,厦门鼓浪屿);flatMap方法list。stream()。flatMap(itemArrays。stream(item。split()))。collect(Collectors。toList())。forEach(System。out::println);结果:北京天安门上海东方明珠厦门鼓浪屿Map方法list。stream()。map(itemStream。of(item。split()))。forEach(System。out::println);java。util。stream。ReferencePipelineHead6576fe71java。util。stream。ReferencePipelineHead76fb509ajava。util。stream。ReferencePipelineHead300ffa5d
我们可以看到他们结果差异是非常大的
Map方法将list转换为了三个小的List对象的结果集
FlatMap方法的操作就是比Map方法的基础上,多做了一个扁平化〔flattening〕操作,将结果转化成一级结构,将里面的结果都取出来。实践ListProductRespDTOlistproductVOList。getList()。stream()。map(d{returnProductRespDTO。builder()。drugEncode(d。getSkuId())。drugName(d。getName())。price(BigDecimal。valueOf(d。getPrice())。pide(newBigDecimal(100)))。usage(d。getUseMethod())。imgUrl(d。getSmallImgUrls()。stream()。findFirst()。orElse(null))。build();
这个例子中是否会存在空指针问题呢,如果是你你会怎么去修改?总结
对于空指针问题,看起来问题不大,但是影响到了线上的业务正常运转,那肯定是不行的。
我们一定要有很清晰的思路去解决这个问题事前,一定要做好日志的打印工作,为了更方便的排查问题;在实现业务逻辑的时候,如果你对你操作的对象不是很确定,那一定要先判空后操作;针对于字符串类型的空指针我们可以采用Objects来做对比;必填字段的入参校验事中,事情既然已经发生了,那需要我们快速的通过日志和Arthas工具来定位问题,快速修复上线减少故障发生的时间:事后,我们可以加强codereview来审查自己的代码,避免这类情况的再次发生。
大家可以分享一下,自己平时遇到空指针是如何处理的
伟大的科学家爱因斯坦创造了,广义相对论我们经常说的伟大的科学家爱因斯坦创造了,广义相对论。一般来说科学家为了思想而创造了物理定律,在数不胜数的科学家也证明了人类的文明历史,之所以文明走向了世界,对于世界来讲文明历史其实
铁陨石陨石(meteorite)也称陨星,是地球以外脱离原有运行轨道的宇宙流星或尘碎块飞快散落到地球或其它行星表面的未燃尽的石质铁质或是石铁混合的物质,陨石在降落地面前与大气层发生摩擦,
搭太空发射系统便车的10颗立方卫星缺少外接电力有停摆风险即将发射的阿尔忒弥斯1号任务火箭上附带了10颗小卫星,这是真的。早在2015年,美国宇航局NASA便开始资助和征集大学和研究机构开发一些小立方卫星,用来搭乘首次升空的太空发射系统(
晓春哥每日推荐聊一款性能实在的洗衣机晓春哥每日推荐今天聊一款性能实在的洗衣机小天鹅TG100V66WIADY。这款洗衣机,我们的综合评分是7。27分,虽然不是特别高,但相对它2千出头的价格来看,对手也不多了。优点1价
MagicLeap2光学升级投影架构动态调光简化焦平面规模量产(映维网Nweon2022年09月02日)全新的企业向AR头显MagicLeap2即将发售,而MagicLeap正继续用挤牙膏的方式来为其造势宣传。如果大家有印象,这家公司早前曾通
诺基亚C31正式发布,打造稳健可靠的入门级智能手机体验2022年9月2日,诺基亚手机之家HMDGlobal正式推出C系列全新产品诺基亚C31。诺基亚C31秉承了诺基亚手机标志性的耐用特征,配备后置三摄,支持夜景人像模式,配合谷歌智能影
索尼小屏旗舰机Xperia5IV发布小屏手机的道路不好走,是很明显的,但是这不代表所有的企业都会放弃掉小屏手机的业务,之前就一直爆料的索尼小屏手机Xperia5IV也在近日发布,那这款手机怎么样?能打破小屏手机销量差
iPhone15Pro将成为2023年最强大智能手机3nmA17芯片如果一切按计划进行,iPhone15Pro将于2023年9月正式发布。iPhone15系列将继续延用iPhone14系列的方式其基础版采用iPhone13的A15一样,iPhone
注意!手机防窥膜正在伤害你的眼睛中关村在线消息9月2日中午,一则防窥膜伤眼睛的消息上了热搜,一名网友分享表示自己在使用了23个月防窥膜之后眼睛都要瞎了,呼吁其他用户们不要使用。笔者身边也有一些手机用户给自己的爱机
常见的手机被监听现象(2)上一篇我们分享了三个手机被监听的常见现象,那么这一篇,我们再介绍三个。现象一通讯录里的陌生人我们的手机里都有几十个或者上百个好友,微信和QQ时不时的同步数据,所以很多人都没有注意到
柏林国际电子消费品展览会IFA2022你会看到什么?柏林国际电子消费品展览会,是德国最大的工业博览会之一,也是德国当前最具规模的电子产品博览会之一,源于1924年,IFA2022于9月2日至9月6日举行。华为华为现宣布在全球范围内推
给安欣的一封信安欣警官你好!我是通过最近热播的电视剧狂飙而认识你,电视里的你是那么纯粹那么无奈那么正直那么可怜那么坚守那么可敬,让我不能不随着剧情的发展而认同你心疼你尊重你。为了更深入的了解你,
韩雪佘诗曼演青蛇引关注,尔冬升反应真实!装都懒得装?综艺节目年年有,唯有吴彤导演总是被骂得出圈,今年他的两部节目纷纷扑街,我们的客栈即便有唐嫣坐镇,还是救不了热度,内容无趣,消耗情怀,各种老套路的小游戏尴尬得不行。另一部无限超越班就
好好笑,不许哭拨浪鼓咚咚响影视连载计划一张海报,让我看到我内心所想象过的大西北,也因为这一张海报吸引我去看这部电影拨浪鼓咚咚响。白雪皑皑梯田十八弯的高坡一个托着孩子似是父亲的男人一辆刻着塬上清涧的大货车孩子
强吻摸胸掀裙底,究竟是真敬业还是趁机揩油?文老余论史编辑老余论史前言你怎么说着说着还上手了呢干这行不就为了这个吗郭德纲的这句话揭开了娱乐圈的遮羞布。演戏如今已经成了男演员的福利?敬业的流氓?2009年的一部一起来看流星雨让
周深无条件生存周深在节目上也从话最少的人变成了话最密的人,他不会允许冷场,像一条鲶鱼一样去活跃气氛。他的行程开始变得越来越忙碌,但病生得反而越来越少,精力越来越旺盛,好像连体质都不一样了。有朋友
为什么有些人天天喝酒,身体却很健康?首先,我要更正饮酒的利与害,酒精物质是世界公认的一类致癌物,对于身体完全是一种百害而无一利的物质,喝酒暖身喝酒促进代谢喝酒抗癌的理论纯属谣言,并不可深信,并无科学原理。所谓的身体健
乔帅筹划大动作,男篮第一控卫恐被清洗,杜锋兄弟回归北京时间2月27日,中国男篮迎来了喜讯,我们刚刚结束了2场世界杯的比赛,都以大比分轻松的拿下了对手,乔帅上任后的首秀,也是完成的十分顺利,但是本场面对伊朗男篮,还是出现了不小的插曲
孟佳这身衣服好辣,露出胸口圆弧肌肤,网友感觉风尘时尚盛典重大活动,诸多明星喜聚一堂,盛装出席,美女姐姐都穿着精心挑选的衣服,在向大家卖力的彰显个人的出挑。而众多网友将关注点放在了孟佳这位姐姐身上,孟佳堪称是全场最性感的明星。她的
情满九道弯第26集预告娱评大赏情满九道弯正在央视八台热播,第26集预告鸿雁为叶菲打抱不平,叶菲回大西北,杨树茂找贺薛阳算账失手把他打伤,杨树茂要和赵亚静结婚。鸿雁为叶菲打抱不平。她指责杨树茂左一个女的相
瞧朱亚文狂妄的样子,真想暴揍一顿!当一个多年远离健身的男人开始负重十公斤做引体向上,你觉得会怎样?会变成一个穿衣显瘦脱衣有肉的帅哥!当一个衣服乱搭胡子懒得刮的学霸突然收拾自己,你觉得会怎样?会变成一个年龄满40减2
中国影史上永远的黄金配角,吴孟达中国电影史上的最黄金配角是谁?或许百分之九十的人脑海中蹦出的都是同一个名字,吴孟达。然而,我们对达叔的关注,往往在于电影,对他的生平知之甚少,如今,斯人已逝,我们怀念达叔,更应该铭