Java8 新特性踩坑篇,java.util.NoSuchElementException: No value present
今天测试老师在测试功能的时候,发现功能提交时居然报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相关推荐
- java国际化服务器不识别_国际化踩坑记录java.util.MissingResourceException:
在做国际化的时候遇到一个bug是无法加载到根目录下的自定义的properties文件 报错如下: java.util.MissingResourceException: Can't find bund ...
- springboot java.util.NoSuchElementException: No value present 异常处理
当通过jpa通过id查询时,使用 findById(id).get(),当id不存在当,也就是数据库没有对应当id数据时,就回报上面当异常 后来查看源码,发现: public T get() {if ...
- java.util.NoSuchElementException: No value present
今天做功能测试,出现如下异常,于自己的代码BokeServiceImpl类中第35行报出: 找到报错所在的行,原代码如下: 原来是调用方法未进行空判断,于是增加空判断,更正如下,问题解决.
- Java基础20:Java8新特性终极指南
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- 快速学习Java8新特性第七讲——Optional类
在<快速学习Java8新特性第五讲--强大的Stream API>这一讲中,我就已经提及到了Optional类.在这一讲中,我将对其做一个更加细致的讲解. Optional类是什么? Op ...
- Java8新特性-Optional,狂神说docker笔记百度云
// 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java 8 已经发布很久了,很多报道表明java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...
最新文章
- 大三Java后端暑期实习面经总结——JVM篇
- 请指出document load和document ready的区别?
- python3.6下载百度云_Python3.6零基础入门与爬虫案例开发教程
- easypoi 如何合并相同的列,如何在Java中的POI中使用XWPFTable合并单元格(或应用colspan)?...
- windows7下cmd中一键切换virtualenv中的Python版本
- Cron表达式 详解
- kubernets kube-proxy原理分析
- Github | 标星9W+如何准备谷歌面试?
- 解决NION‘. Failed rule: ‘orderByClause clusterByClause distributeByClause sortByClause limitClause can
- mac 版 SourceTree(git 客户端)跳过登录验证
- SVN统计一段时间的日志
- matlab正交表,正交表的构造方法及Matlab实现
- JavaScript函数思维导图
- Hexo even主题博客配置
- 柴静十年成长的个人告白 - 读《看见》
- 《Vue插件》瀑布流插件vue-masonry的使用与踩坑记录
- Justinmind使用教程(6)——Justinmind的切换事件toggle
- 文章发布后的阅读量只有个位数该怎么办?
- 响应式布局——Bootstrap
- excel中在公式中实现单元格内换行
热门文章
- URL not found: D:\android-sdk-windows\temp\sysimg_x86-18_r02.zip (拒绝访问。)
- python 企业发放的奖金根据利润提成
- 数组下标的应用——①蒜头君的数字游戏I
- java数组设计的原理_动态图-Java常用数据结构及其设计原理
- 1路编码器或2路DI脉冲计数器,Modbus TCP协议,WiFi模块
- 缺乏实战经验?机会来了,这十个练手项目测测你的实战水平
- 责任链设计模式Demo
- emwin 仪表_分享一个emWin软键盘控件
- matlab选修结课作业,matlab在高等数学中的应用结课作业
- Technical support ofXGX-Gardener