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

消灭空指针,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来审查自己的代码,避免这类情况的再次发生。
  大家可以分享一下,自己平时遇到空指针是如何处理的~

青城山都江堰冲击IPO上市之路或不平坦金融投资报记者林珂继峨眉山A(000888)上市25年多后,四川省景区旅游类上市公司获将迎来新军。近日成都市青城山都江堰旅游股份有限公司(下称青都旅游)披露招股说明书(申报稿),成临港这座全球最大室内滑雪场整体建设任务已经完成75,计划明年上半年开业!市文化旅游局介绍,位于上海临港地区的全球最大室内滑雪场耀雪冰雪世界又传来最新进展。目前,项目整体的建设任务已经完成75,预计今年年底造雪,计划明年上半年开业。详见1200米雪道都市油价或迎大涨,今日(4月9日)全国9295汽油价格,预计大涨近4毛今天的油价将在4月17日晚进行调整,目前预计油价大涨460元吨(0。35元升0。42元升),大家相互转告,4月油价要大幅上涨了今日油价(4月9日)请看下方92,95号汽油与柴油价格三年不倒的经典烤苕皮豆干教程来啦,视频有点长但是很详细苕皮豆干详细制作流程。现在我们就来现场实操。烤一烤烧饼和豆干,我们这个炉子烧的是气。首先先给他刷油,油不要刷的太多太多了下面会着鼓,这样刷一下。这一面刷了以后他这个勺片还是硬的,加iQOO最强新机杀到首发联发科旗舰芯,性能爆裂价格却很香!这两个月我们能明显感到手机圈各大厂商的竞争厮杀达到了白热化,尤其是在千元到两千元这两个档位,由于价格适中最能引起人们的换机欲望,所以各大厂商也在极限的内卷这两个价位段的新机,看谁能小米也加入价格战了!210W快充2亿像素,现在降至1899!不知道最近手机厂商的各类价格战大家关注没有,经过三月一波新机大战,各家手机配置是越来越强,价格却愈发的低,红米的性价优势并不明显,为了保证手机市场的一席之地,红米也不得不以降低价格宝宝喝奶粉总是干呕的第二个原因,要持续关注宝宝身体状态宝宝喝奶粉总是干呕的原因(下)。宝宝刚开始喝奶粉就会干呕,换了好几款奶粉还是这样。那是什么原因?宝宝自身的消化问题,宝宝的胃肠道比较虚弱,刚吃奶粉或断奶的时候宝宝就会出现了无法适应宝宝趴着睡会对身体造成伤害吗?济南市妇幼专家解疑很多宝妈都有这样的疑问,为什么自家的宝宝喜欢趴着睡觉?趴着睡觉会对宝宝的身体健康有影响吗?对此,新黄河记者采访了山东第一医科大学附属济南妇幼保健院(济南市妇幼保健院)儿童保健科主任清风超然,泉韵鲁声超然楼快闪活动让非遗吕剧闪耀泉城大众网海报新闻记者范明昱济南报道明湖烟雨中,歌舞吕韵浓。千佛山下,大明湖畔,超然楼前,戏曲民乐点亮泉城风景,传统文化引领国风IP。海右国风涌泉相报超然楼二十四节气之吕剧快闪活动,4上热门这杯茶不要天天喝,不然时间太长你受不了。今天教大家煮一杯茶,但不要天天喝,怕你时间太长了受不了了。如果你龟头特别的敏感,时间不到2分钟,稍微一刺激就有液体流出,有这种困扰,或许对你消博会期间海口有这些旅文消费活动,更多出行信息近日,海口召开消博会服务保障专题会。海南日报记者从会上获悉,海口各相关职能部门正全力做好第三届中国国际消费品博览会(以下简称消博会)保障工作,已完成96家海口接待酒店的一房一价备案
聪明的人,闭口不说家里的这三件事前言如何判别一个人是否是聪明人,主要是看这个人的言行,举止还有说话的方式,如果这个人说话从来口无遮拦根本不考虑别人的感受那么这样的人一般来说都是比较少,而且非常容易吃亏的,所以在我为什么我们需要更好降噪的麦克风?用惯了降噪麦克风之后,真的很难再回到常规麦克风。短视频时代,降噪的魔力就在于,无论你是一名主播,还是日常vlog爱好者,当我们身处公交地铁户外等相对嘈杂的环境时,能够尽可能降低周围X11真正实现了2000nit峰值亮度的浪漫TCL今年的旗舰款电视X11算是今年电视行业的热度话题之一了,除了最新一代的QDMiniLED,非常耀眼的配置还有2304级硬件分区,2000nit峰值亮度可能大家对2000nit调音台中PAN旋钮和监听的基本知识在视频会议室需要根据实际会议室立体声效果进行左右声道的调整。调音台上有很多旋钮和按键,PAN就是控制立体声偏向的功能旋钮。它的基本功能是声像调节,简单来说当旋钮向左调整,该路的声音扫地机器人十大排名,智能扫地机器人排名推荐冰尊扫地机器人是世界扫地机器人十大排名领军品牌。随着科技的进步,智能扫地机器人的高效持久以及高颜值吸引了众多消费者,走进千家万户。那么智能扫地机器人排名有什么品牌好推荐?下面为大家意大利巴西争夺总冠军,中国女排暂时守住世界第四北京时间7月17日凌晨,在世界女排联赛半决赛上,意大利队以30淘汰东道主土耳其队,首次晋级决赛。意大利队将与巴西队争夺本届联赛冠军。土耳其队将与塞尔维亚队争夺季军。本场比赛,意大利田径世锦赛金牌榜中国再添1金1银,美国豪夺2金登顶,日本下跌北京时间7月17日,俄勒冈田径世锦赛结束了第2个比赛日的较量,当天一共产生了5枚金牌已经全部决出,美国以2金1银2铜登顶了双榜单的榜首,波兰1金2银排名第二,中国以1金1银1铜排名悄悄成为队内得分王!中国男篮队长怒砍17分,抢周琦风头昨晚的中国男篮继续着本届亚洲杯小组赛的征程,他们迎来了最后一个对手,那就是中国台北男篮。这支球队跟中国男篮在澳大利亚墨尔本打世预赛时遇到的对手不同,阵容实力全面升级,有3名在CBA喜讯!继朱婷后中国又有两国手有望留洋他们已被意甲劲旅看中北京时间7月17日,中国排球传来最新消息,据意大利媒体报道,中国男排的主攻手张景胤和俞元泰有望前往欧洲留洋打球,他们两人成为意超劲旅摩德纳在新赛季的引援目标,在本土联赛缺乏竞争力的中华民族伟大复兴中国梦最近有一个特别有趣儿的事,帝都从事商业地产的老友问我对于近期国内互联网企业种种异象有何看法。看了一下微博上也有不同的解读和想象,现在堵车索然无味便和大伙一起聊聊吧。从最近报道的国内卡鲁索裁判从不吹字母哥进攻犯规,所以很难防守他公牛后卫亚利克斯卡鲁索在接受采访时,谈到了上赛季与雄鹿的首轮系列赛。他们的经验更丰富,心态更好。在第一场比赛之后,他们可能讨论了可以做得更好的事情,但第二场比赛我们打得更加渴望胜利