范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

消灭空指针,Java8给我们更好的解决方案

  前言
  在平时的业务开发中,空指针是我们经常遇到的问题,
  他可能会导致我们的流程无法正常进行或者一些意外情况的发生。
  这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢? 空指针场景包装类型字段,因为自动拆箱出现空指针; A对象包含B对象,通过A对象获取B对象字段时,没有判断就直接去调用B对象中的方法出现空指针; 字符串比较, null.equal("字符串") 出现空指针远程返回的List不是空数组而是null,对其进行操作出现空指针。 线上空指针问题如何排查
  日常的开发过程中,一般情况下我们都是通过查看日志来排查空指针的问题,如果日志没有做到位的情况下,我们只能通过 NullPointerException 抛出的位置去跟踪代码。
  这就要求我们,在写代码的时候做好日志的打印 调用方法的入口进行入参的打印,方法返回的结果进行出参打印
  如果没有提前做好日志打印,那我们可以考虑利用阿里的Java诊断工具Arthas来处理 Arthas启动后,获取来了JVM进程 通过watch指令来监测方法的入参情况 思考
  对于这个问题,我总结了一些我在工作中使用到的方法,
  最直接的操作都是从根源上消灭出现空指针的可能性,进行先判空再操作。
  下面拿商品信息作为一个例子,我们要得到他店铺的名称,你会怎么写 @Data public class ProductVO implements Serializable {     @ApiModelProperty("skuId")     private Long skuId;     @ApiModelProperty("商品名称")     private String name;     @ApiModelProperty("品牌名")     private String brandName;     @ApiModelProperty("库存")     private Integer quantity;     @ApiModelProperty("小图列表")     private List smallImgUrls;     @ApiModelProperty("店铺信息")     private ShopVO shop;
  防御性检查,每一个变量都做一次null检查,每一次不确定一个变量是否为null时,都需要添加一个嵌套的if块,这增加了代码的层数。 // 获取店铺名称 private String getShopName1(ProductVO productVO){     if (productVO != null){         ShopVO shop = productVO.getShopVO();         if (shop != null){             return shop.getName();         }     }     return ""; }
  快速失败检查,每一个null检查都是一个退出点,都返回一个固定的字符串,但是不能避免的是,忘记对某一个变量的检查。 // 获取店铺名称 private String getShopName2(ProductVO productVO){     String result = "";     if (Objects.isNull(productVO)){         return result;     }     ShopVO shop = productVO.getShopVO();     if (Objects.isNull(shop)){         return result;     }     return shop.getName(); }
  人为控制,对数据进行严格的控制,不能存在非空字段,但是不能很难保证所有数据都是正常的数据
  利用Java8中的optional来做控制,对缺失的值建模,变量存在时对类进行简单的封装,不存在时,缺失的值会被建模成一个空的Optional对象 private static String getName4(ProductVO productVO){     return Optional.ofNullable(productVO).flatMap(data -> Optional.ofNullable(data.getShopVO()))             .map(ShopVO::getName).orElse(""); } 创建一个Optional封装的ProductVO对象 将Optional转换为Optional 利用map,将Optianal转换为Optional 调用链上的任何一个方法,返回一个空,那么结果就是我们设置的默认值
  上面的几种方法中,我们看到了第四种方法,只用了一行代码就帮我们实现了消灭空指针的动作,但是Java 8中的 Optional 需要结合多个的方法来使用他,现在网上已经有很多详细方法文章,就不再做过多的介绍。 注意Stream中flatMap 与 Map 的区别
  对于Stream流的运算中,flatMap 与 Map是我们常使用到的方法,很多人都没有搞清楚他们的差别是什么。
  map() : map对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。
  flatMap() : flatMap是一种常用的组合子,结合映射[mapping]和扁平化[flattening]。flatMap需要一个处理嵌套列表的函数,然后将结果串连起来。
  举个例子,一眼看出他们的区别 List list = Arrays.asList("北京 天安门", "上海 东方明珠", "厦门 鼓浪屿");  //flatMap方法  list.stream().flatMap(item -> Arrays.stream(item.split(" "))).collect(Collectors.toList()).forEach(System.out::println); //结果: 北京 天安门 上海 东方明珠 厦门 鼓浪屿  // Map方法  list.stream().map(item -> Stream.of(item.split(" "))).forEach(System.out::println);  // java.util.stream.ReferencePipeline$Head@6576fe71  // java.util.stream.ReferencePipeline$Head@76fb509a  // java.util.stream.ReferencePipeline$Head@300ffa5d
  我们可以看到他们结果差异是非常大的
  Map方法将list转换为了三个小的List对象的结果集
  FlatMap方法的操作就是比Map方法的基础上,多做了一个扁平化[flattening]操作,将结果转化成一级结构,将里面的结果都取出来。 实践List list = productVOList.getList().stream().map(d -> {     return ProductRespDTO.builder().drugEncode(d.getSkuId()).drugName(d.getName())         .price(BigDecimal.valueOf(d.getPrice()).pide(new BigDecimal("100"))).usage(d.getUseMethod())         .imgUrl(d.getSmallImgUrls().stream().findFirst().orElse(null)).build();
  这个例子中是否会存在空指针问题呢,如果是你你会怎么去修改? 总结
  对于空指针问题,看起来问题不大,但是影响到了线上的业务正常运转,那肯定是不行的。
  我们一定要有很清晰的思路去解决这个问题 事前,一定要做好日志的打印工作,为了更方便的排查问题; 在实现业务逻辑的时候,如果你对你操作的对象不是很确定,那一定要先判空后操作; 针对于字符串类型的空指针我们可以采用Objects来做对比; 必填字段的入参校验 事中,事情既然已经发生了,那需要我们快速的通过日志和Arthas工具来定位问题,快速修复上线减少故障发生的时间: 事后,我们可以加强code review来审查自己的代码,避免这类情况的再次发生。
  大家可以分享一下,自己平时遇到空指针是如何处理的~

西楚霸王项羽的大名叫啥?以前每次只要看到或听人提到项羽这个名字,首先从我的脑袋里就会蹦出这四个成语十面埋伏,四面楚歌,霸王别姬和乌江自刎,然后紧接着在我脑海中就会浮现出这样的画面西楚霸王项羽与汉王刘邦争夺商鞅变法有功,保护不了自己还被五马分尸,身世如此令人唏嘘假如商鞅知道自己会被五马分尸,他还会积极参与变法吗?变法与被五马分尸居然都发生在商鞅身上。变法是正能量的事,五马分尸却是彻头彻尾的负能量之事。这两件事为什么会发生在同一人身上,可是吉林长春有条黄金大道一到秋天就美如画你去过吗?每年一到10月中下旬,长春百木园的黄金大道就成为深受市民欢迎的打卡地。10月30日,这里再次迎来高光时刻。位于长春市前进大街与南三环交会附近的百木园,是吉林省唯一一家以树木造园为主站在秋天的末尾,看枫叶层林尽染传播丽江新声音做有价值的内容看见丽江在这个陪着枫叶飘零的晚秋,才知道你不是我一生的所有再听一首晚秋,悠悠旋律飘过今年的晚秋时节。在玉龙县的世界记忆遗产公园里,看那枫叶层林尽染,晚秋这份来自顾村公园的秋日温柔,请收下进入秋季顾村公园将从满园的绿逐渐变红变黄变得色彩斑斓在不同的坡向和阳光照射下银杏无患子纳塔栎乌桕枫香黄连木成片的树木层层叠叠颜色绚丽缤纷组成一幅幅多彩的田园风景这份来自顾村公园的秋人生四大幸事,有一条就很美好枕边有书不知道你有没有发现,生活中很多的烦恼,不过是因为书读得太少,却想得太多。有一句话说得很好没事少迷茫,有空多读书。读书是行走于世足以抵御风险的一把佩剑,更是一场通往希望的人生从活着到活好遵循美好生活的100条法则解忧当下的焦虑现状人生路上充满高能量种花种树种光阴,修建一片自己的理想森林。所以现在年轻人一个个都成了斜杠青年,为了自己的理想森林,各种利用碎片化时间进行弯道超车。但是突如其来的疫情打破了人们常态化秋天进补有讲究,建议男人多吃这4种菜,补充营养,身体更健康头条创作挑战赛虽然说女人能顶半边天,其实在当今社会的大多数家庭里,男人才是真正的顶梁柱。男人在外边打拼,赚钱养家,家里出现了大大小小的事情,都需要自己承担,压力之大可想而知。特别是不念过往,不负当下,不畏将来,才是生命最美好的状态人生就像一场旅行,从过去走到现在,又从现在走向未来,而过去现在和未来也就构成了我们美好人生的全部。我们徜徉在时间的长河之中,回首过往,享受当下,畅想未来,不同的人有不同的心态,不同回忆总是美好的记上海校友会(完结版)人的心绪总是矛盾的,昨天心血来潮,把12年前的一幕幕都拿来做镜头重演,越写心情越澎湃,真的好想再回到从前,回到那段刻骨铭心的记忆,但是又特别害怕她看到,看到后或许会欣喜若狂,还在想良时秋风起林间暖酒秋意入喉空山清寂,寥寥无几。桂花香,凉风起,秋来乱心曲。寄目云中雁,点点如金,远处斑斓一片。稻已获,得雨复抽余穗。霞光缕缕,半篙初没,秋水时至,湖上雨晴时。秋风沁寒凉,落叶满地黄,林间暖酒
雨水春雨落下的愿望,万物都会回答文河上花春水寒烟漠漠天接水,碧影沉沉草色青。静柳无风听细雨,飞花漫舞看新晴。好雨知时节,当春乃发生。随风潜入夜,润物细无声。月令七十二候集解记载正月中,天一生水。春始属木,然生木者孩子胃口超好未必是好事,说不定是种病有一种病,病初会让爸妈一喜呀,能吃是福!之后就是一路悲悲悲这么胖了还吃个不停逮着什么都往嘴里塞体重严重超标动不动就生病,严重时刻危及生命智力好像有点低下哎这种病,就是PraderW顺产时的ampampquot开十指ampampquot是将两手全部塞进去吗?在顺产的过程中,医生判断产程进展的时候都会说宫颈口已经开几指了。虽然很多人听说过这个说法,但是作为非医学专业的人,还是搞不懂这个开几指到底有多大?有些人以为开十指就是将两只手全部塞学前三年毛入园率达88。1我国学前教育实现基本普及数据来源教育部制图张丹峰蓝天白云下,山东省青州市高柳中心幼儿园传出阵阵欢声笑语。这所农村幼儿园,跟城市幼儿园没有两样宽敞明亮的教室舒适的塑胶活动场各式各样的玩具。提起家门口的幼儿园实验幼儿园开课说安全来源淳安融媒体中心通讯员胡晓玲日前,淳安县实验幼儿园机关分园开设专课,特邀金峰乡人武部长程志润走上讲坛,主讲国防教育安全知识。程志润从自身经历讲起,用生动形象的国防故事为例,深化和学英语有必要买iEnglish?是骗人的吗?语音矫正系统会自动测评?美国教育家拉塞尔L阿克夫和丹尼尔格林伯格认为,在后工业化时代,未来中国教育不再需要提供为工业企业社会服务的驯良的标准化的产品,而需要与学生时代不断发展相契合的教育,需要一个具有良好闲置的玩具变宝贝,幼儿园来了一群小换客长江日报大武汉客户端2月17日讯2月17日,江汉区稚乐幼儿园的孩子们带着乐乐钱币和玩具兴高采烈地摆起了小摊。当天,幼儿园举行了一场小换客春日环保活动,让孩子们体验一把当小摊主的快乐宝宝湿疹大作战萌娃养成记我想对于大部分的宝妈来说,湿疹并不陌生。我的宝宝近期很不幸中招了,这次是他第二次得湿疹。想着会像第一次一样,厚涂保湿霜三五天就好了,就没放在心上,结果一发不可收拾。前前后现在越来越多孩子患白血病,常见的3类水果,或含大量甲醛!甲醛是大家都知道的一类致癌物,假如长期性触碰,可能会造成染色体畸变基因突变,从而诱发败血症。但很多人对甲醛的认知能力还滞留在房子装修上,事实上,日常生活里常常采用的生活用品,乃至吃儿童电动牙刷有什么坏处?这三大伤牙弊端要谨慎预防最近这几年,小宝宝们的龋齿率居高不下,很多家长都想给自己的小宝宝购买一只清洁力更强的儿童电动牙刷,但是互联网上有一些两极分化的评论劝退了部分家长。一些消费者购买到了不专业的产品,不赵本山9位徒弟现状,回乡务农,工地搬砖,直播带货文成士庸编辑成士庸前言说起赵本山,想必大家都忘不了他在春晚上给大家带来的欢乐,随着他的退居幕后,他的徒弟们并没有光耀师门,而是慢慢消失在了大众的视野中。网红直播带货工地搬砖王金龙王