今天测试老师在测试功能的时候,发现功能提交时居然报No value present错误了。而且还是在其它周边系统上,刚开始以为不是我们系统应该跟我们没关系,直到对方开发老师找过来查日志后,才发现是我写的代码有问题,哭了,还好是测试阶段;原因是我使用了Optional调用Get方法前没有先进行isPresent()判断是否为空,所以导致整个功能报废了;

一、问题

1、事故代码

 List<InsuUserVo> list=new ArrayList<>();InsuUserVo userVo = list.stream().filter(insuUserVo -> "1".equals(insuUserVo.getFlag())).findFirst().get();

2、抛出异常

java.util.NoSuchElementException: No value presentat java.util.Optional.get(Optional.java:135).............

二、源码分析

1、Get方法

从源码中可以看出,当Optional为空时会抛出异常;

/*** If a value is present in this {@code Optional}, returns the value,* otherwise throws {@code NoSuchElementException}.** @return the non-null value held by this {@code Optional}* @throws NoSuchElementException if there is no value present** @see Optional#isPresent()*/
public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;
}

2、isPresent()方法

从源码中可以看到,该方法返回了当前对象是否为Null,所以我们可以先判断当前对象不为Null时再去取值;

/*** Return {@code true} if there is a value present, otherwise {@code false}.** @return {@code true} if there is a value present, otherwise {@code false}*/
public boolean isPresent() {return value != null;
}

3、orElse()方法

从源码中,我们可以看到该方法会对当前的Optional对象进行非空判断,不为空则返回当前值,为空则返回指定值,利用该方法我们也可以避免异常;

/*** Return the value if present, otherwise return {@code other}.** @param other the value to be returned if there is no value present, may* be null* @return the value, if present, otherwise {@code other}*/
public T orElse(T other) {return value != null ? value : other;
}

value就是当前的Optional对象

三、解决方案

1、方式一

        List<InsuUserVo> list=new ArrayList<>();Optional<InsuUserVo> op = list.stream().filter(insuUserVo -> "1".equals(insuUserVo.getFlag())).findFirst();InsuUserVo insuUserVo=null;if (op.isPresent()){insuUserVo=op.get();}

2、方式二

        List<InsuUserVo> list=new ArrayList<>();Optional<InsuUserVo> op = list.stream().filter(insuUserVo -> "1".equals(insuUserVo.getFlag())).findFirst();InsuUserVo insuUserVo = op.orElse(null);if (insuUserVo!=null){}

stream()常用的几种获取Optional对象的方法如下,大家在使用的时候记得检查,先进行present检验,别踩坑;

(1)、findFirst()方法
(2)、min()方法
(3)、max()方法
(4)、findAny()方法
(4)、reduce()方法

希望这篇文章可以帮到大家

Java8 新特性踩坑篇,java.util.NoSuchElementException: No value present相关推荐

  1. java国际化服务器不识别_国际化踩坑记录java.util.MissingResourceException:

    在做国际化的时候遇到一个bug是无法加载到根目录下的自定义的properties文件 报错如下: java.util.MissingResourceException: Can't find bund ...

  2. springboot java.util.NoSuchElementException: No value present 异常处理

    当通过jpa通过id查询时,使用 findById(id).get(),当id不存在当,也就是数据库没有对应当id数据时,就回报上面当异常 后来查看源码,发现: public T get() {if ...

  3. java.util.NoSuchElementException: No value present

    今天做功能测试,出现如下异常,于自己的代码BokeServiceImpl类中第35行报出: 找到报错所在的行,原代码如下: 原来是调用方法未进行空判断,于是增加空判断,更正如下,问题解决.

  4. Java基础20:Java8新特性终极指南

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  5. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  6. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  7. 快速学习Java8新特性第七讲——Optional类

    在<快速学习Java8新特性第五讲--强大的Stream API>这一讲中,我就已经提及到了Optional类.在这一讲中,我将对其做一个更加细致的讲解. Optional类是什么? Op ...

  8. Java8新特性-Optional,狂神说docker笔记百度云

    // 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...

  9. 【Java学习笔记之二十八】深入了解Java8新特性

    前言: Java 8 已经发布很久了,很多报道表明java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...

最新文章

  1. 大三Java后端暑期实习面经总结——JVM篇
  2. 请指出document load和document ready的区别?
  3. python3.6下载百度云_Python3.6零基础入门与爬虫案例开发教程
  4. easypoi 如何合并相同的列,如何在Java中的POI中使用XWPFTable合并单元格(或应用colspan)?...
  5. windows7下cmd中一键切换virtualenv中的Python版本
  6. Cron表达式 详解
  7. kubernets kube-proxy原理分析
  8. Github | 标星9W+如何准备谷歌面试?
  9. 解决NION‘. Failed rule: ‘orderByClause clusterByClause distributeByClause sortByClause limitClause can
  10. mac 版 SourceTree(git 客户端)跳过登录验证
  11. SVN统计一段时间的日志
  12. matlab正交表,正交表的构造方法及Matlab实现
  13. JavaScript函数思维导图
  14. Hexo even主题博客配置
  15. 柴静十年成长的个人告白 - 读《看见》
  16. 《Vue插件》瀑布流插件vue-masonry的使用与踩坑记录
  17. Justinmind使用教程(6)——Justinmind的切换事件toggle
  18. 文章发布后的阅读量只有个位数该怎么办?
  19. 响应式布局——Bootstrap
  20. excel中在公式中实现单元格内换行

热门文章

  1. URL not found: D:\android-sdk-windows\temp\sysimg_x86-18_r02.zip (拒绝访问。)
  2. python 企业发放的奖金根据利润提成
  3. 数组下标的应用——①蒜头君的数字游戏I
  4. java数组设计的原理_动态图-Java常用数据结构及其设计原理
  5. 1路编码器或2路DI脉冲计数器,Modbus TCP协议,WiFi模块
  6. 缺乏实战经验?机会来了,这十个练手项目测测你的实战水平
  7. 责任链设计模式Demo
  8. emwin 仪表_分享一个emWin软键盘控件
  9. matlab选修结课作业,matlab在高等数学中的应用结课作业
  10. Technical support ofXGX-Gardener