线上问题:stream获取值抛出空指针及源码分析
1 场景复现
实体列表,通过stream获取数据,findFirst后,直接使用get获取数据,抛出空指针异常,复现代码如下:
@Testpublic void streamGetUnsafeTest() {List<UserEntity> userEntityList = new ArrayList<>();userEntityList.add(new UserEntity("1", "111", "male"));userEntityList.add(new UserEntity("2", "222", "female"));userEntityList.add(new UserEntity("3", "333", "male"));userEntityList.add(new UserEntity("4", "444", "female"));UserEntity userEntity1 = userEntityList.stream().filter(s-> Objects.equals(s.getSex(), "test")).findFirst().get();}
未查到数据,抛出异常,如图2.1所示。
图2.1 stream未查到数据异常
2 原因
get源码如下,由源码可知,当查不到数据(数据为null)时,get方法直接抛出异常,因此,使用stream获取数据时,需要判断
取到的值是否为null,避免出现空指针。
所在包:package java.util;
类: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;}
3 方案
避免通过stream出现空指针异常,主动抛出的,使用orElse给一个预知的默认值,通过默认值处理当前数据。
3.1 安全操作
@Testpublic void streamGetSafeTest() {List<UserEntity> userEntityList = new ArrayList<>();UserEntity userEntityDefault = new UserEntity();userEntityList.add(new UserEntity("1", "111", "male"));userEntityList.add(new UserEntity("2", "222", "female"));userEntityList.add(new UserEntity("3", "333", "male"));userEntityList.add(new UserEntity("4", "444", "female"));UserEntity userEntity1 = userEntityList.stream().filter(s-> Objects.equals(s.getSex(), "test")).findFirst().orElse(userEntityDefault);logger.info(">>>>>>>>>UserInfo:{}", userEntity1);}
测试结果如图3.1所示,查到的数据为null时,设置为预知的默认值。
图3.1 安全获取值
3.2 测试实体
package com.monkey.java_study.common.entity;/*** User实体** @author xindaqi* @since 2021-01-23*/public class UserEntity {/*** 用户id*/private String uid;/*** 用户名称*/private String nickname;/*** 用户性别*/private String sex = "haha";public UserEntity() {}public UserEntity(String uid) {this.uid = uid;}public UserEntity(String uid, String nickname, String sex) {this.uid = uid;this.nickname = nickname;this.sex = sex;}public UserEntity copy() {return new UserEntity(uid, nickname, sex);}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "UserEntity{" +"uid=" + uid +", nickname='" + nickname + '\'' +", sex='" + sex + '\'' +'}';}
}
4 小结
- 通过stream查询数据时,判断是否会出现空值或者抛出空指针异常;
- 安全的操作是:orElse设定一个预知的默认值。
线上问题:stream获取值抛出空指针及源码分析相关推荐
- 基于线上的茶叶购买小程序(论文+程序设计源码+数据库文件)
微信小程序在日常生活中应用越来越广,网上消费.游戏娱乐等成为了一种常见应用方式.为进一步了解和探索微信小程序在点餐系统中的潜在价值和意义,本文通过使用 Javascript 技术.Spring boo ...
- SSM基于java的线上阅读平台的设计与实现 毕业设计-附源码291023
SSM线上阅读平台开发 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件的工作规则和开发步骤,采用 ...
- 沐歌保健院线上预约按摩系统的设计与实现(论文+源码)_kaic
目 录 摘 要 第一章 绪论 1.1项目研究的背景 1.2开发意义 1.3项目研究现状及内容 1.4论文结构 第二章 开发技术介绍 2.1JSP技术 2.2Eclipse环境配置 2.3M ...
- c iostream.源码_通达信《K线上画趋势线预警》精选指标(附源码)
通达信<K线上画趋势线预警>精选指标 K线上画趋势线预警源码: N:=5; MA5:=EMA(C,5)COLORWHITE; MA13:=EMA(C,13)COLORCYAN; MA21: ...
- spring3.0 aop 获取 ibatis 执行的语句_Mybatis 源码分析:执行器
一.Jdbc的执行过程 一个简单的入门Demo: public static final String URL = "jdbc:mysql://127.0.0.1:3306/mybatis? ...
- 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出
/*** 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出*/import java.util.Scanner;public class ...
- mysql authentication_MySQL连接抛出Authentication Failed错误的分析与解决思路
[问题描述] 在应用端,偶尔看到有如下报错: Authentication to host 'xxxx' for user 'yyyy' using method 'mysql_native_pass ...
- lodash源码分析之获取数据类型
所有的悲伤,总会留下一丝欢乐的线索,所有的遗憾,总会留下一处完美的角落,我在冰峰的深海,寻找希望的缺口,却在惊醒时,瞥见绝美的阳光! --几米 本文为读 lodash 源码的第十八篇,后续文章会更新到 ...
- 史上超级详细:HashMap源码分析,你了解到源码的魅力了嘛
##HashMap1.8和1.8之前的源码差别很大 目录 简介 数据结构 类结构 属性 构造方法 增加 1.HashMap简介 HashMap基于哈希表的Map接口实现,是以key-value存储形式 ...
最新文章
- oracle中将number类型毫秒值转为时间类型
- [YTU]_2716 统计不及格人数
- 怎么会执行sql 懒加载 没用_太神奇的 SQL 查询经历,group by 慢查询优化!
- 他是我们内心世界的一员 (见信息时报2011年7月10日)
- 【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t
- python统计汉字个数是_Python中文词频统计
- Python 中 if __name__ == '__main__': 的理解
- MPEG-2TS码流编辑的原理及其应用(转载
- python生成范围内随机数_python在一个范围内取随机数的方法是什么
- 华为云TaurusDB性能挑战赛-java赛题mvn编译时报错:不支持multi-catch
- jQuery基础部分笔记
- MOOS学习笔记1——HelloWorld
- boost::lockfree::queue多线程读写实例
- 云计算实战系列七(管道及重定向)
- ubuntu14上安装ros教程
- Alfresco安装与配置图解
- 【python技能树】强推10款Python常用的开发工具
- Vue + Spring Boot 项目实战(一):项目简介
- 干货|TPM管理系列之六源改善
- Mini主机安装Ubuntu18.04记录